From 03943c56027f0f87dd64ad5a5cab989753843821 Mon Sep 17 00:00:00 2001 From: jackstar12 Date: Mon, 10 Feb 2025 13:11:34 +0100 Subject: [PATCH 1/2] feat: `BumpWalletTransaction` rpc --- docs/grpc.md | 36 + internal/cln/cln.go | 4 + internal/lnd/lnd.go | 4 + internal/macaroons/permissions.go | 4 + .../mocks/lightning/LightningNode_mock.go | 57 + internal/mocks/onchain/Wallet_mock.go | 57 + internal/onchain/onchain.go | 1 + internal/onchain/wallet/wallet.go | 191 ++- internal/onchain/wallet/wallet_test.go | 31 + internal/rpcserver/router.go | 12 + internal/rpcserver/rpcserver_test.go | 101 +- internal/test/test.go | 16 + pkg/boltzrpc/boltzrpc.pb.go | 1031 ++++++++++------- pkg/boltzrpc/boltzrpc.proto | 18 + pkg/boltzrpc/boltzrpc_grpc.pb.go | 39 + pkg/boltzrpc/client/client.go | 4 + 16 files changed, 1094 insertions(+), 512 deletions(-) diff --git a/docs/grpc.md b/docs/grpc.md index 5cd51f51..99e76fb2 100644 --- a/docs/grpc.md +++ b/docs/grpc.md @@ -197,6 +197,14 @@ Returns recent transactions from a wallet. | ------- | -------- | | [`ListWalletTransactionsRequest`](#listwallettransactionsrequest) | [`ListWalletTransactionsResponse`](#listwallettransactionsresponse) | +#### BumpWalletTransaction + +Increase the fee of a wallet transaction using RBF. + +| Request | Response | +| ------- | -------- | +| [`BumpWalletTransactionRequest`](#bumpwallettransactionrequest) | [`BumpWalletTransactionResponse`](#bumpwallettransactionresponse) | + #### GetWalletCredentials Returns the credentials of a wallet. The password will be required if the wallet is encrypted. @@ -395,6 +403,34 @@ Bakes a new macaroon with the specified permissions. The macaroon can also be re +#### BumpWalletTransactionRequest + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `id` | [`uint64`](#uint64) | | id of the wallet which the transaction belongs to | +| `sat_per_vbyte` | [`double`](#double) | | fee rate for the new transaction | +| `tx_id` | [`string`](#string) | | id of the transaction to bump | + + + + + +#### BumpWalletTransactionResponse + + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `tx_id` | [`string`](#string) | | | + + + + + #### ChainSwapData diff --git a/internal/cln/cln.go b/internal/cln/cln.go index 0f545c37..69da1bdb 100755 --- a/internal/cln/cln.go +++ b/internal/cln/cln.go @@ -166,6 +166,10 @@ func (c *Cln) GetTransactions(limit, offset uint64) ([]*onchain.WalletTransactio return nil, errors.New("not implemented for cln") } +func (c *Cln) BumpTransactionFee(txId string, feeRate float64) (string, error) { + return "", errors.New("not implemented for cln") +} + func (c *Cln) SanityCheck() (string, error) { info, err := c.Client.Getinfo(context.Background(), &protos.GetinfoRequest{}) if err != nil { diff --git a/internal/lnd/lnd.go b/internal/lnd/lnd.go index f8b19d3b..ef679d68 100644 --- a/internal/lnd/lnd.go +++ b/internal/lnd/lnd.go @@ -225,6 +225,10 @@ func (lnd *LND) GetTransactions(limit, offset uint64) ([]*onchain.WalletTransact return nil, errors.New("not implemented for lnd") } +func (lnd *LND) BumpTransactionFee(txId string, feeRate float64) (string, error) { + return "", errors.New("not implemented for lnd") +} + func (lnd *LND) CreateInvoice(value uint64, preimage []byte, expiry int64, memo string) (*lightning.AddInvoiceResponse, error) { request := &lnrpc.Invoice{ Memo: memo, diff --git a/internal/macaroons/permissions.go b/internal/macaroons/permissions.go index f9a233cc..e3993e63 100644 --- a/internal/macaroons/permissions.go +++ b/internal/macaroons/permissions.go @@ -161,6 +161,10 @@ var ( Entity: "wallet", Action: "read", }}, + "/boltzrpc.Boltz/BumpWalletTransaction": {{ + Entity: "wallet", + Action: "write", + }}, "/boltzrpc.Boltz/GetWallet": {{ Entity: "wallet", Action: "read", diff --git a/internal/mocks/lightning/LightningNode_mock.go b/internal/mocks/lightning/LightningNode_mock.go index ccff25fe..4303e251 100644 --- a/internal/mocks/lightning/LightningNode_mock.go +++ b/internal/mocks/lightning/LightningNode_mock.go @@ -24,6 +24,63 @@ func (_m *MockLightningNode) EXPECT() *MockLightningNode_Expecter { return &MockLightningNode_Expecter{mock: &_m.Mock} } +// BumpTransactionFee provides a mock function with given fields: txId, satPerVbyte +func (_m *MockLightningNode) BumpTransactionFee(txId string, satPerVbyte float64) (string, error) { + ret := _m.Called(txId, satPerVbyte) + + if len(ret) == 0 { + panic("no return value specified for BumpTransactionFee") + } + + var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(string, float64) (string, error)); ok { + return rf(txId, satPerVbyte) + } + if rf, ok := ret.Get(0).(func(string, float64) string); ok { + r0 = rf(txId, satPerVbyte) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(string, float64) error); ok { + r1 = rf(txId, satPerVbyte) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockLightningNode_BumpTransactionFee_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BumpTransactionFee' +type MockLightningNode_BumpTransactionFee_Call struct { + *mock.Call +} + +// BumpTransactionFee is a helper method to define mock.On call +// - txId string +// - satPerVbyte float64 +func (_e *MockLightningNode_Expecter) BumpTransactionFee(txId interface{}, satPerVbyte interface{}) *MockLightningNode_BumpTransactionFee_Call { + return &MockLightningNode_BumpTransactionFee_Call{Call: _e.mock.On("BumpTransactionFee", txId, satPerVbyte)} +} + +func (_c *MockLightningNode_BumpTransactionFee_Call) Run(run func(txId string, satPerVbyte float64)) *MockLightningNode_BumpTransactionFee_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(float64)) + }) + return _c +} + +func (_c *MockLightningNode_BumpTransactionFee_Call) Return(_a0 string, _a1 error) *MockLightningNode_BumpTransactionFee_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *MockLightningNode_BumpTransactionFee_Call) RunAndReturn(run func(string, float64) (string, error)) *MockLightningNode_BumpTransactionFee_Call { + _c.Call.Return(run) + return _c +} + // CheckInvoicePaid provides a mock function with given fields: paymentHash func (_m *MockLightningNode) CheckInvoicePaid(paymentHash []byte) (bool, error) { ret := _m.Called(paymentHash) diff --git a/internal/mocks/onchain/Wallet_mock.go b/internal/mocks/onchain/Wallet_mock.go index db40a364..f1be4651 100644 --- a/internal/mocks/onchain/Wallet_mock.go +++ b/internal/mocks/onchain/Wallet_mock.go @@ -20,6 +20,63 @@ func (_m *MockWallet) EXPECT() *MockWallet_Expecter { return &MockWallet_Expecter{mock: &_m.Mock} } +// BumpTransactionFee provides a mock function with given fields: txId, satPerVbyte +func (_m *MockWallet) BumpTransactionFee(txId string, satPerVbyte float64) (string, error) { + ret := _m.Called(txId, satPerVbyte) + + if len(ret) == 0 { + panic("no return value specified for BumpTransactionFee") + } + + var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(string, float64) (string, error)); ok { + return rf(txId, satPerVbyte) + } + if rf, ok := ret.Get(0).(func(string, float64) string); ok { + r0 = rf(txId, satPerVbyte) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(string, float64) error); ok { + r1 = rf(txId, satPerVbyte) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockWallet_BumpTransactionFee_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BumpTransactionFee' +type MockWallet_BumpTransactionFee_Call struct { + *mock.Call +} + +// BumpTransactionFee is a helper method to define mock.On call +// - txId string +// - satPerVbyte float64 +func (_e *MockWallet_Expecter) BumpTransactionFee(txId interface{}, satPerVbyte interface{}) *MockWallet_BumpTransactionFee_Call { + return &MockWallet_BumpTransactionFee_Call{Call: _e.mock.On("BumpTransactionFee", txId, satPerVbyte)} +} + +func (_c *MockWallet_BumpTransactionFee_Call) Run(run func(txId string, satPerVbyte float64)) *MockWallet_BumpTransactionFee_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(float64)) + }) + return _c +} + +func (_c *MockWallet_BumpTransactionFee_Call) Return(_a0 string, _a1 error) *MockWallet_BumpTransactionFee_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *MockWallet_BumpTransactionFee_Call) RunAndReturn(run func(string, float64) (string, error)) *MockWallet_BumpTransactionFee_Call { + _c.Call.Return(run) + return _c +} + // Disconnect provides a mock function with given fields: func (_m *MockWallet) Disconnect() error { ret := _m.Called() diff --git a/internal/onchain/onchain.go b/internal/onchain/onchain.go index e566bea1..26dd1fac 100644 --- a/internal/onchain/onchain.go +++ b/internal/onchain/onchain.go @@ -94,6 +94,7 @@ type Wallet interface { GetWalletInfo() WalletInfo Disconnect() error GetTransactions(limit, offset uint64) ([]*WalletTransaction, error) + BumpTransactionFee(txId string, satPerVbyte float64) (string, error) } type ElectrumOptions struct { diff --git a/internal/onchain/wallet/wallet.go b/internal/onchain/wallet/wallet.go index 0e76970e..3c0ea594 100644 --- a/internal/onchain/wallet/wallet.go +++ b/internal/onchain/wallet/wallet.go @@ -720,17 +720,19 @@ func (wallet *Wallet) createTransaction(address string, amount uint64, satPerVby return nil, err } - // Disable RBF - for asset, current := range outputs.Unspent { - if len(current) > int(config.MaxInputs) { - if sendAll { - outputs.Unspent[asset] = current[:config.MaxInputs] - } else { - return nil, errors.New("too many inputs") + // Disable RBF on liquid + if wallet.Currency == boltz.CurrencyLiquid { + for asset, current := range outputs.Unspent { + if len(current) > int(config.MaxInputs) { + if sendAll { + outputs.Unspent[asset] = current[:config.MaxInputs] + } else { + return nil, errors.New("too many inputs") + } + } + for _, output := range current { + output["sequence"] = wire.MaxTxInSequenceNum - 1 } - } - for _, output := range current { - output["sequence"] = wire.MaxTxInSequenceNum - 1 } } @@ -766,44 +768,18 @@ func (wallet *Wallet) createTransaction(address string, amount uint64, satPerVby return result, nil } -func (wallet *Wallet) GetSendFee(address string, amount uint64, satPerVbyte float64, sendAll bool) (send uint64, fee uint64, err error) { - result, err := wallet.createTransaction(address, amount, satPerVbyte, sendAll) - if err != nil { - return 0, 0, err - } - var createTx struct { - Fee uint64 - Addressees []struct { - Satoshi uint64 - } - Error string - } - if err := mapstructure.Decode(result, &createTx); err != nil { - return 0, 0, err - } - if createTx.Error != "" { - return 0, 0, errors.New(createTx.Error) - } - return createTx.Addressees[0].Satoshi, createTx.Fee, nil -} - -func (wallet *Wallet) SendToAddress(address string, amount uint64, satPerVbyte float64, sendAll bool) (tx string, err error) { - result, err := wallet.createTransaction(address, amount, satPerVbyte, sendAll) - if err != nil { - return "", err - } - +func (wallet *Wallet) broadcastTransaction(transaction any) (tx string, err error) { wallet.spentOutputsLock.Lock() defer wallet.spentOutputsLock.Unlock() handler := new(AuthHandler) - params, free := toJson(result) - if err := withAuthHandler(C.GA_blind_transaction(wallet.session, params, handler), handler, &result); err != nil { + params, free := toJson(transaction) + if err := withAuthHandler(C.GA_blind_transaction(wallet.session, params, handler), handler, &transaction); err != nil { return "", err } free() - params, free = toJson(result) - if err := withAuthHandler(C.GA_sign_transaction(wallet.session, params, handler), handler, &result); err != nil { + params, free = toJson(transaction) + if err := withAuthHandler(C.GA_sign_transaction(wallet.session, params, handler), handler, &transaction); err != nil { return "", err } free() @@ -815,7 +791,7 @@ func (wallet *Wallet) SendToAddress(address string, amount uint64, satPerVbyte f TxId string `mapstructure:"txhash"` } `mapstructure:"transaction_inputs"` } - if err := mapstructure.Decode(result, &signedTx); err != nil { + if err := mapstructure.Decode(transaction, &signedTx); err != nil { return "", err } if signedTx.Error != "" { @@ -825,7 +801,7 @@ func (wallet *Wallet) SendToAddress(address string, amount uint64, satPerVbyte f if wallet.txProvider != nil { tx, err = wallet.txProvider.BroadcastTransaction(signedTx.Transaction) } else { - params, free = toJson(result) + params, free = toJson(transaction) var sendTx struct { TxHash string `json:"txhash"` Error string `json:"error"` @@ -851,6 +827,36 @@ func (wallet *Wallet) SendToAddress(address string, amount uint64, satPerVbyte f return tx, nil } +func (wallet *Wallet) GetSendFee(address string, amount uint64, satPerVbyte float64, sendAll bool) (send uint64, fee uint64, err error) { + result, err := wallet.createTransaction(address, amount, satPerVbyte, sendAll) + if err != nil { + return 0, 0, err + } + var createTx struct { + Fee uint64 + Addressees []struct { + Satoshi uint64 + } + Error string + } + if err := mapstructure.Decode(result, &createTx); err != nil { + return 0, 0, err + } + if createTx.Error != "" { + return 0, 0, errors.New(createTx.Error) + } + return createTx.Addressees[0].Satoshi, createTx.Fee, nil +} + +func (wallet *Wallet) SendToAddress(address string, amount uint64, satPerVbyte float64, sendAll bool) (tx string, err error) { + result, err := wallet.createTransaction(address, amount, satPerVbyte, sendAll) + if err != nil { + return "", err + } + + return wallet.broadcastTransaction(result) +} + func (wallet *Wallet) SetSpentOutputs(outputs []string) { wallet.spentOutputsLock.Lock() defer wallet.spentOutputsLock.Unlock() @@ -860,7 +866,7 @@ func (wallet *Wallet) SetSpentOutputs(outputs []string) { } } -func (wallet *Wallet) GetTransactions(limit, offset uint64) ([]*onchain.WalletTransaction, error) { +func (wallet *Wallet) getTransactions(limit, offset uint64) ([]map[string]any, error) { if wallet.subaccount == nil { return nil, ErrSubAccountNotSet } @@ -878,27 +884,19 @@ func (wallet *Wallet) GetTransactions(limit, offset uint64) ([]*onchain.WalletTr defer free() handler := new(AuthHandler) var result struct { - Transactions []struct { - BlockHeight uint32 `json:"block_height"` - TxId string `json:"txhash"` - Inputs []struct { - Address string `json:"address"` - Satoshi uint64 `json:"satoshi"` - IsRelevant bool `json:"is_relevant"` - } - Outputs []struct { - Address string `json:"address"` - Satoshi uint64 `json:"satoshi"` - IsRelevant bool `json:"is_relevant"` - } - Timestamp int64 `json:"created_at_ts"` - Type string `json:"type"` - Satoshi map[string]int64 `json:"satoshi"` - } `json:"transactions"` + Transactions []map[string]any `json:"transactions"` } if err := withAuthHandler(C.GA_get_transactions(wallet.session, params, handler), handler, &result); err != nil { return nil, err } + return result.Transactions, nil +} + +func (wallet *Wallet) GetTransactions(limit, offset uint64) ([]*onchain.WalletTransaction, error) { + result, err := wallet.getTransactions(limit, offset) + if err != nil { + return nil, err + } asset := "btc" if wallet.Currency == boltz.CurrencyLiquid { @@ -906,7 +904,27 @@ func (wallet *Wallet) GetTransactions(limit, offset uint64) ([]*onchain.WalletTr } var transactions []*onchain.WalletTransaction - for _, tx := range result.Transactions { + for _, rawTx := range result { + var tx struct { + BlockHeight uint32 `mapstructure:"block_height"` + TxId string `mapstructure:"txhash"` + Inputs []struct { + Address string `mapstructure:"address"` + Satoshi uint64 `mapstructure:"satoshi"` + IsRelevant bool `mapstructure:"is_relevant"` + } + Outputs []struct { + Address string `mapstructure:"address"` + Satoshi uint64 `mapstructure:"satoshi"` + IsRelevant bool `mapstructure:"is_relevant"` + } + Timestamp int64 `mapstructure:"created_at_ts"` + Type string `mapstructure:"type"` + Satoshi map[string]int64 `mapstructure:"satoshi"` + } + if err := mapstructure.Decode(rawTx, &tx); err != nil { + return nil, err + } var outputs []onchain.TransactionOutput for _, out := range tx.Outputs { outputs = append(outputs, onchain.TransactionOutput{ @@ -928,6 +946,55 @@ func (wallet *Wallet) GetTransactions(limit, offset uint64) ([]*onchain.WalletTr return transactions, nil } +func (wallet *Wallet) BumpTransactionFee(txId string, satPerVbyte float64) (string, error) { + if wallet.subaccount == nil { + return "", ErrSubAccountNotSet + } + outputs, err := wallet.getUnspentOutputs(*wallet.subaccount, false) + if err != nil { + return "", err + } + + var limit uint64 = 30 + var offset uint64 + var found any + for { + result, err := wallet.getTransactions(limit, offset) + if err != nil { + return "", err + } + for _, tx := range result { + if tx["txhash"] == txId { + found = tx + break + } + } + if len(result) < int(limit) { + break + } + offset += limit + } + if found == nil { + return "", errors.New("previous transaction not found") + } + + transactionDetails, free := toJson(map[string]any{ + // gdk uses sat/kVB + "fee_rate": satPerVbyte * 1000, + "utxos": outputs.Unspent, + "previous_transaction": found, + }) + defer free() + + handler := new(AuthHandler) + var result any + if err := withAuthHandler(C.GA_create_transaction(wallet.session, transactionDetails, handler), handler, &result); err != nil { + return "", err + } + + return wallet.broadcastTransaction(result) +} + func (wallet *Wallet) Ready() bool { //return wallet.connected && wallet.subaccount != nil return wallet.connected diff --git a/internal/onchain/wallet/wallet_test.go b/internal/onchain/wallet/wallet_test.go index 91a3305d..6b1e1025 100644 --- a/internal/onchain/wallet/wallet_test.go +++ b/internal/onchain/wallet/wallet_test.go @@ -256,6 +256,37 @@ func TestAutoConsolidate(t *testing.T) { } +func TestWallet_BumpTransactionFee(t *testing.T) { + getTransaction := func(txId string) *onchain.WalletTransaction { + test.WaitWalletTx(t, txId) + txs, err := wallet.GetTransactions(0, 0) + require.NoError(t, err) + for _, tx := range txs { + if tx.Id == txId { + return tx + } + } + require.Fail(t, "transaction not found") + return nil + } + + someAddress := test.GetNewAddress(test.BtcCli) + amount := int64(1000) + + txId, err := wallet.SendToAddress(someAddress, uint64(amount), 1, false) + require.NoError(t, err) + tx := getTransaction(txId) + + newTxId, err := wallet.BumpTransactionFee(txId, 2) + require.NoError(t, err) + test.WaitWalletTx(t, newTxId) + newTx := getTransaction(newTxId) + + oldFee := tx.BalanceChange + amount + newFee := newTx.BalanceChange + amount + require.Equal(t, 2*oldFee, newFee) +} + func TestConfig_Validate(t *testing.T) { tests := []struct { name string diff --git a/internal/rpcserver/router.go b/internal/rpcserver/router.go index ad4c8888..7d45a01f 100644 --- a/internal/rpcserver/router.go +++ b/internal/rpcserver/router.go @@ -1641,6 +1641,18 @@ func (server *routedBoltzServer) ListWalletTransactions(ctx context.Context, req return response, nil } +func (server *routedBoltzServer) BumpWalletTransaction(ctx context.Context, request *boltzrpc.BumpWalletTransactionRequest) (*boltzrpc.BumpWalletTransactionResponse, error) { + wallet, err := server.getWallet(ctx, onchain.WalletChecker{Id: &request.Id, AllowReadonly: false}) + if err != nil { + return nil, err + } + tx, err := wallet.BumpTransactionFee(request.TxId, request.GetSatPerVbyte()) + if err != nil { + return nil, err + } + return &boltzrpc.BumpWalletTransactionResponse{TxId: tx}, nil +} + func (server *routedBoltzServer) serializeWallet(wal onchain.Wallet) (*boltzrpc.Wallet, error) { info := wal.GetWalletInfo() result := &boltzrpc.Wallet{ diff --git a/internal/rpcserver/rpcserver_test.go b/internal/rpcserver/rpcserver_test.go index 28c6352e..3353e72e 100644 --- a/internal/rpcserver/rpcserver_test.go +++ b/internal/rpcserver/rpcserver_test.go @@ -7,6 +7,7 @@ import ( "context" "crypto/sha256" "encoding/hex" + "errors" "fmt" "github.com/BoltzExchange/boltz-client/v2/internal/test" "github.com/BoltzExchange/boltz-client/v2/pkg/boltzrpc/serializers" @@ -1361,19 +1362,7 @@ func TestWalletTransactions(t *testing.T) { return } } - notifier := wallet.TransactionNotifier.Get() - defer wallet.TransactionNotifier.Remove(notifier) - timeout := time.After(30 * time.Second) - for { - select { - case notification := <-notifier: - if notification.TxId == txId { - return - } - case <-timeout: - require.Fail(t, "timed out while waiting for tx") - } - } + test.WaitWalletTx(t, txId) } t.Run("Pagination", func(t *testing.T) { @@ -1482,6 +1471,92 @@ func TestWalletTransactions(t *testing.T) { test.MineBlock() } +func TestBumpWalletTransaction(t *testing.T) { + chain := getOnchain(t, loadConfig(t)) + client, _, stop := setup(t, setupOptions{chain: chain}) + defer stop() + + request := &boltzrpc.BumpWalletTransactionRequest{ + Id: 1234, + TxId: "transaction", + SatPerVbyte: 10, + } + newTxId := "newTransaction" + + tests := []struct { + desc string + setupWallet func(mock *onchainmock.MockWallet) + wantErr string + }{ + { + desc: "Success", + setupWallet: func(mock *onchainmock.MockWallet) { + mock.EXPECT().GetWalletInfo().Return(onchain.WalletInfo{ + Id: request.Id, + Readonly: false, + TenantId: database.DefaultTenantId, + }) + mock.EXPECT().BumpTransactionFee(request.TxId, request.SatPerVbyte).Return(newTxId, nil) + }, + }, + { + desc: "Error", + setupWallet: func(mock *onchainmock.MockWallet) { + mock.EXPECT().GetWalletInfo().Return(onchain.WalletInfo{ + Id: request.Id, + Readonly: false, + TenantId: database.DefaultTenantId, + }) + mock.EXPECT().BumpTransactionFee(request.TxId, request.SatPerVbyte).Return("", errors.New("error")) + }, + wantErr: "error", + }, + { + desc: "Not Found", + setupWallet: func(mock *onchainmock.MockWallet) { + mock.EXPECT().GetWalletInfo().Return(onchain.WalletInfo{ + Id: 12342, + Readonly: false, + TenantId: database.DefaultTenantId, + }) + }, + wantErr: "not found", + }, + { + desc: "Readonly", + setupWallet: func(mock *onchainmock.MockWallet) { + mock.EXPECT().GetWalletInfo().Return(onchain.WalletInfo{ + Id: request.Id, + Readonly: true, + TenantId: database.DefaultTenantId, + }) + }, + wantErr: "not found", + }, + } + + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + mockWallet := onchainmock.NewMockWallet(t) + mockWallet.EXPECT().Ready().Return(true) + tc.setupWallet(mockWallet) + + chain.AddWallet(mockWallet) + t.Cleanup(func() { + chain.RemoveWallet(mockWallet.GetWalletInfo().Id) + }) + + _, err := client.BumpWalletTransaction(request) + if tc.wantErr != "" { + require.Error(t, err) + require.Contains(t, err.Error(), tc.wantErr) + } else { + require.NoError(t, err) + } + }) + } +} + func TestWallet(t *testing.T) { client, _, stop := setup(t, setupOptions{}) defer stop() diff --git a/internal/test/test.go b/internal/test/test.go index cfafa0ea..6db8288d 100644 --- a/internal/test/test.go +++ b/internal/test/test.go @@ -234,3 +234,19 @@ func PastDate(duration time.Duration) time.Time { func PrintBackendLogs() { fmt.Println(bash("docker logs boltz-backend")) } + +func WaitWalletTx(t *testing.T, txId string) { + notifier := wallet.TransactionNotifier.Get() + defer wallet.TransactionNotifier.Remove(notifier) + timeout := time.After(30 * time.Second) + for { + select { + case notification := <-notifier: + if notification.TxId == txId { + return + } + case <-timeout: + require.Fail(t, "timed out while waiting for tx") + } + } +} diff --git a/pkg/boltzrpc/boltzrpc.pb.go b/pkg/boltzrpc/boltzrpc.pb.go index bfe2f304..daf5fb27 100644 --- a/pkg/boltzrpc/boltzrpc.pb.go +++ b/pkg/boltzrpc/boltzrpc.pb.go @@ -5133,6 +5133,119 @@ func (x *WalletTransaction) GetInfos() []*TransactionInfo { return nil } +type BumpWalletTransactionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // id of the wallet which the transaction belongs to + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + // fee rate for the new transaction + SatPerVbyte float64 `protobuf:"fixed64,2,opt,name=sat_per_vbyte,json=satPerVbyte,proto3" json:"sat_per_vbyte,omitempty"` + // id of the transaction to bump + TxId string `protobuf:"bytes,3,opt,name=tx_id,json=txId,proto3" json:"tx_id,omitempty"` +} + +func (x *BumpWalletTransactionRequest) Reset() { + *x = BumpWalletTransactionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_boltzrpc_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BumpWalletTransactionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BumpWalletTransactionRequest) ProtoMessage() {} + +func (x *BumpWalletTransactionRequest) ProtoReflect() protoreflect.Message { + mi := &file_boltzrpc_proto_msgTypes[63] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BumpWalletTransactionRequest.ProtoReflect.Descriptor instead. +func (*BumpWalletTransactionRequest) Descriptor() ([]byte, []int) { + return file_boltzrpc_proto_rawDescGZIP(), []int{63} +} + +func (x *BumpWalletTransactionRequest) GetId() uint64 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *BumpWalletTransactionRequest) GetSatPerVbyte() float64 { + if x != nil { + return x.SatPerVbyte + } + return 0 +} + +func (x *BumpWalletTransactionRequest) GetTxId() string { + if x != nil { + return x.TxId + } + return "" +} + +type BumpWalletTransactionResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TxId string `protobuf:"bytes,1,opt,name=tx_id,json=txId,proto3" json:"tx_id,omitempty"` +} + +func (x *BumpWalletTransactionResponse) Reset() { + *x = BumpWalletTransactionResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_boltzrpc_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BumpWalletTransactionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BumpWalletTransactionResponse) ProtoMessage() {} + +func (x *BumpWalletTransactionResponse) ProtoReflect() protoreflect.Message { + mi := &file_boltzrpc_proto_msgTypes[64] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BumpWalletTransactionResponse.ProtoReflect.Descriptor instead. +func (*BumpWalletTransactionResponse) Descriptor() ([]byte, []int) { + return file_boltzrpc_proto_rawDescGZIP(), []int{64} +} + +func (x *BumpWalletTransactionResponse) GetTxId() string { + if x != nil { + return x.TxId + } + return "" +} + type TransactionInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5146,7 +5259,7 @@ type TransactionInfo struct { func (x *TransactionInfo) Reset() { *x = TransactionInfo{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[63] + mi := &file_boltzrpc_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5159,7 +5272,7 @@ func (x *TransactionInfo) String() string { func (*TransactionInfo) ProtoMessage() {} func (x *TransactionInfo) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[63] + mi := &file_boltzrpc_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5172,7 +5285,7 @@ func (x *TransactionInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionInfo.ProtoReflect.Descriptor instead. func (*TransactionInfo) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{63} + return file_boltzrpc_proto_rawDescGZIP(), []int{65} } func (x *TransactionInfo) GetSwapId() string { @@ -5203,7 +5316,7 @@ type TransactionOutput struct { func (x *TransactionOutput) Reset() { *x = TransactionOutput{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[64] + mi := &file_boltzrpc_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5216,7 +5329,7 @@ func (x *TransactionOutput) String() string { func (*TransactionOutput) ProtoMessage() {} func (x *TransactionOutput) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[64] + mi := &file_boltzrpc_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5229,7 +5342,7 @@ func (x *TransactionOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionOutput.ProtoReflect.Descriptor instead. func (*TransactionOutput) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{64} + return file_boltzrpc_proto_rawDescGZIP(), []int{66} } func (x *TransactionOutput) GetAddress() string { @@ -5264,7 +5377,7 @@ type ListWalletTransactionsResponse struct { func (x *ListWalletTransactionsResponse) Reset() { *x = ListWalletTransactionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[65] + mi := &file_boltzrpc_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5277,7 +5390,7 @@ func (x *ListWalletTransactionsResponse) String() string { func (*ListWalletTransactionsResponse) ProtoMessage() {} func (x *ListWalletTransactionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[65] + mi := &file_boltzrpc_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5290,7 +5403,7 @@ func (x *ListWalletTransactionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWalletTransactionsResponse.ProtoReflect.Descriptor instead. func (*ListWalletTransactionsResponse) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{65} + return file_boltzrpc_proto_rawDescGZIP(), []int{67} } func (x *ListWalletTransactionsResponse) GetTransactions() []*WalletTransaction { @@ -5312,7 +5425,7 @@ type GetWalletCredentialsRequest struct { func (x *GetWalletCredentialsRequest) Reset() { *x = GetWalletCredentialsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[66] + mi := &file_boltzrpc_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5325,7 +5438,7 @@ func (x *GetWalletCredentialsRequest) String() string { func (*GetWalletCredentialsRequest) ProtoMessage() {} func (x *GetWalletCredentialsRequest) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[66] + mi := &file_boltzrpc_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5338,7 +5451,7 @@ func (x *GetWalletCredentialsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWalletCredentialsRequest.ProtoReflect.Descriptor instead. func (*GetWalletCredentialsRequest) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{66} + return file_boltzrpc_proto_rawDescGZIP(), []int{68} } func (x *GetWalletCredentialsRequest) GetId() uint64 { @@ -5366,7 +5479,7 @@ type RemoveWalletRequest struct { func (x *RemoveWalletRequest) Reset() { *x = RemoveWalletRequest{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[67] + mi := &file_boltzrpc_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5379,7 +5492,7 @@ func (x *RemoveWalletRequest) String() string { func (*RemoveWalletRequest) ProtoMessage() {} func (x *RemoveWalletRequest) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[67] + mi := &file_boltzrpc_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5392,7 +5505,7 @@ func (x *RemoveWalletRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveWalletRequest.ProtoReflect.Descriptor instead. func (*RemoveWalletRequest) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{67} + return file_boltzrpc_proto_rawDescGZIP(), []int{69} } func (x *RemoveWalletRequest) GetId() uint64 { @@ -5422,7 +5535,7 @@ type WalletSendRequest struct { func (x *WalletSendRequest) Reset() { *x = WalletSendRequest{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[68] + mi := &file_boltzrpc_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5435,7 +5548,7 @@ func (x *WalletSendRequest) String() string { func (*WalletSendRequest) ProtoMessage() {} func (x *WalletSendRequest) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[68] + mi := &file_boltzrpc_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5448,7 +5561,7 @@ func (x *WalletSendRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WalletSendRequest.ProtoReflect.Descriptor instead. func (*WalletSendRequest) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{68} + return file_boltzrpc_proto_rawDescGZIP(), []int{70} } func (x *WalletSendRequest) GetId() uint64 { @@ -5504,7 +5617,7 @@ type WalletSendResponse struct { func (x *WalletSendResponse) Reset() { *x = WalletSendResponse{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[69] + mi := &file_boltzrpc_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5517,7 +5630,7 @@ func (x *WalletSendResponse) String() string { func (*WalletSendResponse) ProtoMessage() {} func (x *WalletSendResponse) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[69] + mi := &file_boltzrpc_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5530,7 +5643,7 @@ func (x *WalletSendResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WalletSendResponse.ProtoReflect.Descriptor instead. func (*WalletSendResponse) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{69} + return file_boltzrpc_proto_rawDescGZIP(), []int{71} } func (x *WalletSendResponse) GetTxId() string { @@ -5551,7 +5664,7 @@ type WalletReceiveRequest struct { func (x *WalletReceiveRequest) Reset() { *x = WalletReceiveRequest{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[70] + mi := &file_boltzrpc_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5564,7 +5677,7 @@ func (x *WalletReceiveRequest) String() string { func (*WalletReceiveRequest) ProtoMessage() {} func (x *WalletReceiveRequest) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[70] + mi := &file_boltzrpc_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5577,7 +5690,7 @@ func (x *WalletReceiveRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WalletReceiveRequest.ProtoReflect.Descriptor instead. func (*WalletReceiveRequest) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{70} + return file_boltzrpc_proto_rawDescGZIP(), []int{72} } func (x *WalletReceiveRequest) GetId() uint64 { @@ -5598,7 +5711,7 @@ type WalletReceiveResponse struct { func (x *WalletReceiveResponse) Reset() { *x = WalletReceiveResponse{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[71] + mi := &file_boltzrpc_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5611,7 +5724,7 @@ func (x *WalletReceiveResponse) String() string { func (*WalletReceiveResponse) ProtoMessage() {} func (x *WalletReceiveResponse) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[71] + mi := &file_boltzrpc_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5624,7 +5737,7 @@ func (x *WalletReceiveResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WalletReceiveResponse.ProtoReflect.Descriptor instead. func (*WalletReceiveResponse) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{71} + return file_boltzrpc_proto_rawDescGZIP(), []int{73} } func (x *WalletReceiveResponse) GetAddress() string { @@ -5650,7 +5763,7 @@ type Wallet struct { func (x *Wallet) Reset() { *x = Wallet{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[72] + mi := &file_boltzrpc_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5663,7 +5776,7 @@ func (x *Wallet) String() string { func (*Wallet) ProtoMessage() {} func (x *Wallet) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[72] + mi := &file_boltzrpc_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5676,7 +5789,7 @@ func (x *Wallet) ProtoReflect() protoreflect.Message { // Deprecated: Use Wallet.ProtoReflect.Descriptor instead. func (*Wallet) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{72} + return file_boltzrpc_proto_rawDescGZIP(), []int{74} } func (x *Wallet) GetId() uint64 { @@ -5732,7 +5845,7 @@ type Wallets struct { func (x *Wallets) Reset() { *x = Wallets{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[73] + mi := &file_boltzrpc_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5745,7 +5858,7 @@ func (x *Wallets) String() string { func (*Wallets) ProtoMessage() {} func (x *Wallets) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[73] + mi := &file_boltzrpc_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5758,7 +5871,7 @@ func (x *Wallets) ProtoReflect() protoreflect.Message { // Deprecated: Use Wallets.ProtoReflect.Descriptor instead. func (*Wallets) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{73} + return file_boltzrpc_proto_rawDescGZIP(), []int{75} } func (x *Wallets) GetWallets() []*Wallet { @@ -5781,7 +5894,7 @@ type Balance struct { func (x *Balance) Reset() { *x = Balance{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[74] + mi := &file_boltzrpc_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5794,7 +5907,7 @@ func (x *Balance) String() string { func (*Balance) ProtoMessage() {} func (x *Balance) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[74] + mi := &file_boltzrpc_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5807,7 +5920,7 @@ func (x *Balance) ProtoReflect() protoreflect.Message { // Deprecated: Use Balance.ProtoReflect.Descriptor instead. func (*Balance) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{74} + return file_boltzrpc_proto_rawDescGZIP(), []int{76} } func (x *Balance) GetTotal() uint64 { @@ -5845,7 +5958,7 @@ type Subaccount struct { func (x *Subaccount) Reset() { *x = Subaccount{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[75] + mi := &file_boltzrpc_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5858,7 +5971,7 @@ func (x *Subaccount) String() string { func (*Subaccount) ProtoMessage() {} func (x *Subaccount) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[75] + mi := &file_boltzrpc_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5871,7 +5984,7 @@ func (x *Subaccount) ProtoReflect() protoreflect.Message { // Deprecated: Use Subaccount.ProtoReflect.Descriptor instead. func (*Subaccount) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{75} + return file_boltzrpc_proto_rawDescGZIP(), []int{77} } func (x *Subaccount) GetBalance() *Balance { @@ -5911,7 +6024,7 @@ type RemoveWalletResponse struct { func (x *RemoveWalletResponse) Reset() { *x = RemoveWalletResponse{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[76] + mi := &file_boltzrpc_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5924,7 +6037,7 @@ func (x *RemoveWalletResponse) String() string { func (*RemoveWalletResponse) ProtoMessage() {} func (x *RemoveWalletResponse) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[76] + mi := &file_boltzrpc_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5937,7 +6050,7 @@ func (x *RemoveWalletResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveWalletResponse.ProtoReflect.Descriptor instead. func (*RemoveWalletResponse) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{76} + return file_boltzrpc_proto_rawDescGZIP(), []int{78} } type UnlockRequest struct { @@ -5951,7 +6064,7 @@ type UnlockRequest struct { func (x *UnlockRequest) Reset() { *x = UnlockRequest{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[77] + mi := &file_boltzrpc_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5964,7 +6077,7 @@ func (x *UnlockRequest) String() string { func (*UnlockRequest) ProtoMessage() {} func (x *UnlockRequest) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[77] + mi := &file_boltzrpc_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5977,7 +6090,7 @@ func (x *UnlockRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnlockRequest.ProtoReflect.Descriptor instead. func (*UnlockRequest) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{77} + return file_boltzrpc_proto_rawDescGZIP(), []int{79} } func (x *UnlockRequest) GetPassword() string { @@ -5998,7 +6111,7 @@ type VerifyWalletPasswordRequest struct { func (x *VerifyWalletPasswordRequest) Reset() { *x = VerifyWalletPasswordRequest{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[78] + mi := &file_boltzrpc_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6011,7 +6124,7 @@ func (x *VerifyWalletPasswordRequest) String() string { func (*VerifyWalletPasswordRequest) ProtoMessage() {} func (x *VerifyWalletPasswordRequest) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[78] + mi := &file_boltzrpc_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6024,7 +6137,7 @@ func (x *VerifyWalletPasswordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifyWalletPasswordRequest.ProtoReflect.Descriptor instead. func (*VerifyWalletPasswordRequest) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{78} + return file_boltzrpc_proto_rawDescGZIP(), []int{80} } func (x *VerifyWalletPasswordRequest) GetPassword() string { @@ -6045,7 +6158,7 @@ type VerifyWalletPasswordResponse struct { func (x *VerifyWalletPasswordResponse) Reset() { *x = VerifyWalletPasswordResponse{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[79] + mi := &file_boltzrpc_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6058,7 +6171,7 @@ func (x *VerifyWalletPasswordResponse) String() string { func (*VerifyWalletPasswordResponse) ProtoMessage() {} func (x *VerifyWalletPasswordResponse) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[79] + mi := &file_boltzrpc_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6071,7 +6184,7 @@ func (x *VerifyWalletPasswordResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifyWalletPasswordResponse.ProtoReflect.Descriptor instead. func (*VerifyWalletPasswordResponse) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{79} + return file_boltzrpc_proto_rawDescGZIP(), []int{81} } func (x *VerifyWalletPasswordResponse) GetCorrect() bool { @@ -6093,7 +6206,7 @@ type ChangeWalletPasswordRequest struct { func (x *ChangeWalletPasswordRequest) Reset() { *x = ChangeWalletPasswordRequest{} if protoimpl.UnsafeEnabled { - mi := &file_boltzrpc_proto_msgTypes[80] + mi := &file_boltzrpc_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6106,7 +6219,7 @@ func (x *ChangeWalletPasswordRequest) String() string { func (*ChangeWalletPasswordRequest) ProtoMessage() {} func (x *ChangeWalletPasswordRequest) ProtoReflect() protoreflect.Message { - mi := &file_boltzrpc_proto_msgTypes[80] + mi := &file_boltzrpc_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6119,7 +6232,7 @@ func (x *ChangeWalletPasswordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeWalletPasswordRequest.ProtoReflect.Descriptor instead. func (*ChangeWalletPasswordRequest) Descriptor() ([]byte, []int) { - return file_boltzrpc_proto_rawDescGZIP(), []int{80} + return file_boltzrpc_proto_rawDescGZIP(), []int{82} } func (x *ChangeWalletPasswordRequest) GetOld() string { @@ -6912,298 +7025,314 @@ var file_boltzrpc_proto_rawDesc = []byte{ 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x6a, 0x0a, 0x0f, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, - 0x0a, 0x07, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x06, 0x73, 0x77, 0x61, 0x70, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x62, 0x6f, 0x6c, - 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, - 0x73, 0x77, 0x61, 0x70, 0x5f, 0x69, 0x64, 0x22, 0x6b, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, - 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x6f, 0x75, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x4f, 0x75, 0x72, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x22, 0x61, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, - 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5b, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x22, 0x25, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0xfe, 0x01, 0x0a, 0x11, - 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0d, 0x73, 0x61, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, - 0x62, 0x79, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x61, - 0x74, 0x50, 0x65, 0x72, 0x56, 0x62, 0x79, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, - 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, - 0x52, 0x07, 0x73, 0x65, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, - 0x69, 0x73, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x0d, 0x69, 0x73, 0x53, 0x77, 0x61, 0x70, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x61, - 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x62, 0x79, 0x74, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, - 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x69, 0x73, 0x5f, - 0x73, 0x77, 0x61, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x29, 0x0a, 0x12, - 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x22, 0x26, 0x0a, 0x14, 0x57, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, - 0x31, 0x0a, 0x15, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x22, 0xc2, 0x01, 0x0a, 0x06, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x08, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, - 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x12, 0x2b, 0x0a, - 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x67, 0x0a, 0x1c, 0x42, + 0x75, 0x6d, 0x70, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x73, + 0x61, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x62, 0x79, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x0b, 0x73, 0x61, 0x74, 0x50, 0x65, 0x72, 0x56, 0x62, 0x79, 0x74, 0x65, 0x12, + 0x13, 0x0a, 0x05, 0x74, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x78, 0x49, 0x64, 0x22, 0x34, 0x0a, 0x1d, 0x42, 0x75, 0x6d, 0x70, 0x57, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x22, 0x6a, 0x0a, 0x0f, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, + 0x07, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x06, 0x73, 0x77, 0x61, 0x70, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x62, 0x6f, 0x6c, 0x74, + 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x73, + 0x77, 0x61, 0x70, 0x5f, 0x69, 0x64, 0x22, 0x6b, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, + 0x0e, 0x69, 0x73, 0x5f, 0x6f, 0x75, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x4f, 0x75, 0x72, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x22, 0x61, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, + 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x6f, + 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5b, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x22, 0x25, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0xfe, 0x01, 0x0a, 0x11, 0x57, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0d, 0x73, 0x61, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x62, + 0x79, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x61, 0x74, + 0x50, 0x65, 0x72, 0x56, 0x62, 0x79, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x73, + 0x65, 0x6e, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, + 0x07, 0x73, 0x65, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x69, + 0x73, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x0d, 0x69, 0x73, 0x53, 0x77, 0x61, 0x70, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x61, 0x74, + 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x62, 0x79, 0x74, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x73, + 0x65, 0x6e, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x69, 0x73, 0x5f, 0x73, + 0x77, 0x61, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x29, 0x0a, 0x12, 0x57, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x22, 0x26, 0x0a, 0x14, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, + 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x31, + 0x0a, 0x15, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x22, 0xc2, 0x01, 0x0a, 0x06, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x2e, 0x0a, 0x08, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x08, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x12, 0x2b, 0x0a, 0x07, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, + 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x74, 0x65, + 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x35, 0x0a, 0x07, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, + 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, 0x61, + 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x07, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x22, 0x5f, 0x0a, + 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, + 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0b, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x22, 0x89, + 0x01, 0x0a, 0x0a, 0x53, 0x75, 0x62, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x0a, + 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, - 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x74, - 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x35, 0x0a, 0x07, 0x57, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x07, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x22, 0x5f, - 0x0a, 0x07, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, - 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x12, 0x20, 0x0a, - 0x0b, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0b, 0x75, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x22, - 0x89, 0x01, 0x0a, 0x0a, 0x53, 0x75, 0x62, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2b, - 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x0a, 0x0d, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x22, 0x39, 0x0a, 0x1b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x38, 0x0a, 0x1c, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, - 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x6f, - 0x72, 0x72, 0x65, 0x63, 0x74, 0x22, 0x41, 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x57, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6f, 0x6c, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6e, 0x65, 0x77, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6e, 0x65, 0x77, 0x2a, 0x25, 0x0a, 0x0e, 0x4d, 0x61, 0x63, 0x61, - 0x72, 0x6f, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x45, - 0x41, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x01, 0x2a, - 0x62, 0x0a, 0x09, 0x53, 0x77, 0x61, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, - 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x55, 0x43, - 0x43, 0x45, 0x53, 0x53, 0x46, 0x55, 0x4c, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x46, 0x55, 0x4e, 0x44, - 0x45, 0x44, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x42, 0x41, 0x4e, 0x44, 0x4f, 0x4e, 0x45, - 0x44, 0x10, 0x05, 0x2a, 0x1d, 0x0a, 0x08, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, - 0x07, 0x0a, 0x03, 0x42, 0x54, 0x43, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x42, 0x54, 0x43, - 0x10, 0x01, 0x2a, 0x31, 0x0a, 0x08, 0x53, 0x77, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, - 0x0a, 0x09, 0x53, 0x55, 0x42, 0x4d, 0x41, 0x52, 0x49, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, - 0x07, 0x52, 0x45, 0x56, 0x45, 0x52, 0x53, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x48, - 0x41, 0x49, 0x4e, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x53, 0x77, 0x61, 0x70, 0x73, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x55, - 0x54, 0x4f, 0x10, 0x02, 0x2a, 0x54, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, - 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x4f, 0x43, 0x4b, 0x55, 0x50, 0x10, 0x01, - 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x46, 0x55, 0x4e, 0x44, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, - 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4e, 0x53, 0x4f, - 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x32, 0xd6, 0x14, 0x0a, 0x05, 0x42, - 0x6f, 0x6c, 0x74, 0x7a, 0x12, 0x3e, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x18, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x62, 0x6f, 0x6c, 0x74, - 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, + 0x65, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2b, 0x0a, 0x0d, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, + 0x39, 0x0a, 0x1b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x38, 0x0a, 0x1c, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x72, 0x72, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x6f, 0x72, + 0x72, 0x65, 0x63, 0x74, 0x22, 0x41, 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x57, 0x61, + 0x6c, 0x6c, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6f, 0x6c, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6e, 0x65, 0x77, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6e, 0x65, 0x77, 0x2a, 0x25, 0x0a, 0x0e, 0x4d, 0x61, 0x63, 0x61, 0x72, + 0x6f, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x45, 0x41, + 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x01, 0x2a, 0x62, + 0x0a, 0x09, 0x53, 0x77, 0x61, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x50, + 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x55, 0x43, 0x43, + 0x45, 0x53, 0x53, 0x46, 0x55, 0x4c, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x46, 0x55, 0x4e, 0x44, 0x45, + 0x44, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x42, 0x41, 0x4e, 0x44, 0x4f, 0x4e, 0x45, 0x44, + 0x10, 0x05, 0x2a, 0x1d, 0x0a, 0x08, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x07, + 0x0a, 0x03, 0x42, 0x54, 0x43, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x42, 0x54, 0x43, 0x10, + 0x01, 0x2a, 0x31, 0x0a, 0x08, 0x53, 0x77, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, + 0x09, 0x53, 0x55, 0x42, 0x4d, 0x41, 0x52, 0x49, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, + 0x52, 0x45, 0x56, 0x45, 0x52, 0x53, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x48, 0x41, + 0x49, 0x4e, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, + 0x77, 0x61, 0x70, 0x73, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x55, 0x54, + 0x4f, 0x10, 0x02, 0x2a, 0x54, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x4f, 0x43, 0x4b, 0x55, 0x50, 0x10, 0x01, 0x12, + 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x46, 0x55, 0x4e, 0x44, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x43, + 0x4c, 0x41, 0x49, 0x4d, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4e, 0x53, 0x4f, 0x4c, + 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x32, 0xc0, 0x15, 0x0a, 0x05, 0x42, 0x6f, + 0x6c, 0x74, 0x7a, 0x12, 0x3e, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, + 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, + 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, - 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x3f, - 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x50, 0x61, 0x69, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x2e, - 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x69, 0x72, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x62, 0x6f, - 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x3e, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x61, 0x69, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, - 0x65, 0x74, 0x50, 0x61, 0x69, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x44, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, 0x12, 0x1a, 0x2e, 0x62, - 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, - 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x12, 0x19, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x62, - 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x66, 0x75, - 0x6e, 0x64, 0x53, 0x77, 0x61, 0x70, 0x12, 0x1b, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, - 0x63, 0x2e, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, - 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x53, 0x77, 0x61, 0x70, 0x73, - 0x12, 0x1b, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6c, 0x61, 0x69, - 0x6d, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x53, 0x77, - 0x61, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0b, 0x47, - 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x2e, 0x62, 0x6f, 0x6c, - 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, - 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x77, - 0x61, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1c, 0x2e, 0x62, - 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x6f, 0x6c, - 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x43, 0x0a, 0x07, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x18, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, - 0x63, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x19, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, - 0x12, 0x47, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x77, 0x61, 0x70, 0x12, 0x1b, - 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x62, 0x6f, - 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x77, 0x61, - 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1e, 0x2e, 0x62, 0x6f, 0x6c, - 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x62, 0x6f, 0x6c, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x3f, 0x0a, + 0x0b, 0x47, 0x65, 0x74, 0x50, 0x61, 0x69, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x2e, 0x62, + 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x69, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x62, 0x6f, 0x6c, + 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3e, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x61, 0x69, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, + 0x74, 0x50, 0x61, 0x69, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, 0x12, 0x1a, 0x2e, 0x62, 0x6f, + 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, + 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, + 0x12, 0x19, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x62, 0x6f, + 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x66, 0x75, 0x6e, + 0x64, 0x53, 0x77, 0x61, 0x70, 0x12, 0x1b, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, + 0x2e, 0x52, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, + 0x74, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x53, 0x77, 0x61, 0x70, 0x73, 0x12, + 0x1b, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x6d, + 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x62, + 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x53, 0x77, 0x61, + 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0b, 0x47, 0x65, + 0x74, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x2e, 0x62, 0x6f, 0x6c, 0x74, + 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, + 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x77, 0x61, + 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1c, 0x2e, 0x62, 0x6f, + 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x6f, 0x6c, 0x74, + 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x43, 0x0a, 0x07, 0x44, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x18, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, + 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x19, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, + 0x47, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x77, 0x61, 0x70, 0x12, 0x1b, 0x2e, + 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x77, 0x61, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x77, 0x61, 0x70, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x5c, 0x0a, - 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, 0x77, - 0x61, 0x70, 0x12, 0x22, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, 0x77, 0x61, 0x70, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, - 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, - 0x77, 0x61, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0f, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x77, 0x61, 0x70, 0x12, 0x20, - 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x68, 0x61, 0x69, - 0x6e, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4d, 0x0a, 0x0c, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x62, 0x6f, 0x6c, 0x74, - 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1e, 0x2e, 0x62, 0x6f, 0x6c, 0x74, + 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x62, 0x6f, 0x6c, 0x74, + 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x77, 0x61, 0x70, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x5c, 0x0a, 0x11, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, 0x77, 0x61, + 0x70, 0x12, 0x22, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, 0x77, + 0x61, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0f, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x77, 0x61, 0x70, 0x12, 0x20, 0x2e, + 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, + 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4d, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x49, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, - 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, - 0x70, 0x63, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x53, 0x65, 0x74, - 0x53, 0x75, 0x62, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x62, 0x6f, 0x6c, - 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x75, 0x62, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x62, 0x6f, 0x6c, - 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x53, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, - 0x74, 0x53, 0x75, 0x62, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, - 0x65, 0x74, 0x53, 0x75, 0x62, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x73, 0x12, 0x1b, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x11, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x12, 0x1a, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x62, - 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x48, - 0x0a, 0x10, 0x47, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x46, - 0x65, 0x65, 0x12, 0x1b, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x12, 0x6b, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, - 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x27, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x6f, - 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x25, 0x2e, - 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, - 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x12, 0x4d, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x12, 0x1d, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x47, 0x0a, 0x0a, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x1b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, + 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x49, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, + 0x70, 0x63, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, + 0x63, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x53, + 0x75, 0x62, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x62, 0x6f, 0x6c, 0x74, + 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x75, 0x62, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x62, 0x6f, 0x6c, 0x74, + 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x53, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x12, 0x1f, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x75, 0x62, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, + 0x74, 0x53, 0x75, 0x62, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, + 0x74, 0x73, 0x12, 0x1b, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, + 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x11, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, + 0x74, 0x73, 0x12, 0x39, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, + 0x1a, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x61, + 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x62, 0x6f, + 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x48, 0x0a, + 0x10, 0x47, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, + 0x65, 0x12, 0x1b, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x62, 0x6f, - 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6e, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0d, 0x57, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x12, 0x1e, 0x2e, 0x62, 0x6f, 0x6c, - 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x63, 0x65, - 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x62, 0x6f, 0x6c, - 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x63, 0x65, - 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x53, - 0x74, 0x6f, 0x70, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x06, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x17, 0x2e, - 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x65, - 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x25, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, + 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x12, 0x6b, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x27, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x62, 0x6f, 0x6c, + 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x15, 0x42, 0x75, 0x6d, 0x70, 0x57, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, + 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x75, 0x6d, 0x70, 0x57, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, + 0x2e, 0x42, 0x75, 0x6d, 0x70, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, + 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x25, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, + 0x63, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, + 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x4d, 0x0a, 0x0c, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x62, 0x6f, 0x6c, + 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x61, 0x6c, 0x6c, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x62, 0x6f, 0x6c, 0x74, + 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x57, 0x61, 0x6c, + 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x1b, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, + 0x70, 0x63, 0x2e, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, + 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0d, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x12, 0x1e, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x57, + 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x06, + 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x17, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, + 0x63, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x65, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x25, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x57, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x25, 0x2e, - 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x57, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x0c, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x62, - 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, + 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x25, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, + 0x63, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, + 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, + 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, + 0x6e, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x1c, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x39, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, + 0x1a, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x62, 0x6f, - 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x4a, 0x0a, - 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x1c, 0x2e, 0x62, - 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6e, 0x61, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x62, 0x6f, 0x6c, - 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x09, 0x47, 0x65, 0x74, - 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x1a, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, - 0x63, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x65, - 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x0c, 0x42, 0x61, 0x6b, 0x65, 0x4d, 0x61, 0x63, 0x61, - 0x72, 0x6f, 0x6f, 0x6e, 0x12, 0x1d, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, - 0x42, 0x61, 0x6b, 0x65, 0x4d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x42, - 0x61, 0x6b, 0x65, 0x4d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x42, 0x6f, 0x6c, 0x74, 0x7a, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2f, - 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x2d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x76, 0x32, 0x2f, - 0x70, 0x6b, 0x67, 0x2f, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x4d, 0x0a, + 0x0c, 0x42, 0x61, 0x6b, 0x65, 0x4d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x12, 0x1d, 0x2e, + 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x6b, 0x65, 0x4d, 0x61, 0x63, + 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x62, + 0x6f, 0x6c, 0x74, 0x7a, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x61, 0x6b, 0x65, 0x4d, 0x61, 0x63, 0x61, + 0x72, 0x6f, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x37, 0x5a, 0x35, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x6f, 0x6c, 0x74, 0x7a, + 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2f, 0x62, 0x6f, 0x6c, 0x74, 0x7a, 0x2d, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x62, 0x6f, 0x6c, + 0x74, 0x7a, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7219,7 +7348,7 @@ func file_boltzrpc_proto_rawDescGZIP() []byte { } var file_boltzrpc_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_boltzrpc_proto_msgTypes = make([]protoimpl.MessageInfo, 81) +var file_boltzrpc_proto_msgTypes = make([]protoimpl.MessageInfo, 83) var file_boltzrpc_proto_goTypes = []interface{}{ (MacaroonAction)(0), // 0: boltzrpc.MacaroonAction (SwapState)(0), // 1: boltzrpc.SwapState @@ -7290,25 +7419,27 @@ var file_boltzrpc_proto_goTypes = []interface{}{ (*WalletSendFee)(nil), // 66: boltzrpc.WalletSendFee (*ListWalletTransactionsRequest)(nil), // 67: boltzrpc.ListWalletTransactionsRequest (*WalletTransaction)(nil), // 68: boltzrpc.WalletTransaction - (*TransactionInfo)(nil), // 69: boltzrpc.TransactionInfo - (*TransactionOutput)(nil), // 70: boltzrpc.TransactionOutput - (*ListWalletTransactionsResponse)(nil), // 71: boltzrpc.ListWalletTransactionsResponse - (*GetWalletCredentialsRequest)(nil), // 72: boltzrpc.GetWalletCredentialsRequest - (*RemoveWalletRequest)(nil), // 73: boltzrpc.RemoveWalletRequest - (*WalletSendRequest)(nil), // 74: boltzrpc.WalletSendRequest - (*WalletSendResponse)(nil), // 75: boltzrpc.WalletSendResponse - (*WalletReceiveRequest)(nil), // 76: boltzrpc.WalletReceiveRequest - (*WalletReceiveResponse)(nil), // 77: boltzrpc.WalletReceiveResponse - (*Wallet)(nil), // 78: boltzrpc.Wallet - (*Wallets)(nil), // 79: boltzrpc.Wallets - (*Balance)(nil), // 80: boltzrpc.Balance - (*Subaccount)(nil), // 81: boltzrpc.Subaccount - (*RemoveWalletResponse)(nil), // 82: boltzrpc.RemoveWalletResponse - (*UnlockRequest)(nil), // 83: boltzrpc.UnlockRequest - (*VerifyWalletPasswordRequest)(nil), // 84: boltzrpc.VerifyWalletPasswordRequest - (*VerifyWalletPasswordResponse)(nil), // 85: boltzrpc.VerifyWalletPasswordResponse - (*ChangeWalletPasswordRequest)(nil), // 86: boltzrpc.ChangeWalletPasswordRequest - (*empty.Empty)(nil), // 87: google.protobuf.Empty + (*BumpWalletTransactionRequest)(nil), // 69: boltzrpc.BumpWalletTransactionRequest + (*BumpWalletTransactionResponse)(nil), // 70: boltzrpc.BumpWalletTransactionResponse + (*TransactionInfo)(nil), // 71: boltzrpc.TransactionInfo + (*TransactionOutput)(nil), // 72: boltzrpc.TransactionOutput + (*ListWalletTransactionsResponse)(nil), // 73: boltzrpc.ListWalletTransactionsResponse + (*GetWalletCredentialsRequest)(nil), // 74: boltzrpc.GetWalletCredentialsRequest + (*RemoveWalletRequest)(nil), // 75: boltzrpc.RemoveWalletRequest + (*WalletSendRequest)(nil), // 76: boltzrpc.WalletSendRequest + (*WalletSendResponse)(nil), // 77: boltzrpc.WalletSendResponse + (*WalletReceiveRequest)(nil), // 78: boltzrpc.WalletReceiveRequest + (*WalletReceiveResponse)(nil), // 79: boltzrpc.WalletReceiveResponse + (*Wallet)(nil), // 80: boltzrpc.Wallet + (*Wallets)(nil), // 81: boltzrpc.Wallets + (*Balance)(nil), // 82: boltzrpc.Balance + (*Subaccount)(nil), // 83: boltzrpc.Subaccount + (*RemoveWalletResponse)(nil), // 84: boltzrpc.RemoveWalletResponse + (*UnlockRequest)(nil), // 85: boltzrpc.UnlockRequest + (*VerifyWalletPasswordRequest)(nil), // 86: boltzrpc.VerifyWalletPasswordRequest + (*VerifyWalletPasswordResponse)(nil), // 87: boltzrpc.VerifyWalletPasswordResponse + (*ChangeWalletPasswordRequest)(nil), // 88: boltzrpc.ChangeWalletPasswordRequest + (*empty.Empty)(nil), // 89: google.protobuf.Empty } var file_boltzrpc_proto_depIdxs = []int32{ 10, // 0: boltzrpc.ListTenantsResponse.tenants:type_name -> boltzrpc.Tenant @@ -7371,21 +7502,21 @@ var file_boltzrpc_proto_depIdxs = []int32{ 55, // 57: boltzrpc.ImportWalletRequest.credentials:type_name -> boltzrpc.WalletCredentials 56, // 58: boltzrpc.ImportWalletRequest.params:type_name -> boltzrpc.WalletParams 56, // 59: boltzrpc.CreateWalletRequest.params:type_name -> boltzrpc.WalletParams - 78, // 60: boltzrpc.CreateWalletResponse.wallet:type_name -> boltzrpc.Wallet - 81, // 61: boltzrpc.GetSubaccountsResponse.subaccounts:type_name -> boltzrpc.Subaccount + 80, // 60: boltzrpc.CreateWalletResponse.wallet:type_name -> boltzrpc.Wallet + 83, // 61: boltzrpc.GetSubaccountsResponse.subaccounts:type_name -> boltzrpc.Subaccount 2, // 62: boltzrpc.GetWalletsRequest.currency:type_name -> boltzrpc.Currency - 70, // 63: boltzrpc.WalletTransaction.outputs:type_name -> boltzrpc.TransactionOutput - 69, // 64: boltzrpc.WalletTransaction.infos:type_name -> boltzrpc.TransactionInfo + 72, // 63: boltzrpc.WalletTransaction.outputs:type_name -> boltzrpc.TransactionOutput + 71, // 64: boltzrpc.WalletTransaction.infos:type_name -> boltzrpc.TransactionInfo 5, // 65: boltzrpc.TransactionInfo.type:type_name -> boltzrpc.TransactionType 68, // 66: boltzrpc.ListWalletTransactionsResponse.transactions:type_name -> boltzrpc.WalletTransaction 2, // 67: boltzrpc.Wallet.currency:type_name -> boltzrpc.Currency - 80, // 68: boltzrpc.Wallet.balance:type_name -> boltzrpc.Balance - 78, // 69: boltzrpc.Wallets.wallets:type_name -> boltzrpc.Wallet - 80, // 70: boltzrpc.Subaccount.balance:type_name -> boltzrpc.Balance + 82, // 68: boltzrpc.Wallet.balance:type_name -> boltzrpc.Balance + 80, // 69: boltzrpc.Wallets.wallets:type_name -> boltzrpc.Wallet + 82, // 70: boltzrpc.Subaccount.balance:type_name -> boltzrpc.Balance 22, // 71: boltzrpc.Boltz.GetInfo:input_type -> boltzrpc.GetInfoRequest 29, // 72: boltzrpc.Boltz.GetServiceInfo:input_type -> boltzrpc.GetServiceInfoRequest 16, // 73: boltzrpc.Boltz.GetPairInfo:input_type -> boltzrpc.GetPairInfoRequest - 87, // 74: boltzrpc.Boltz.GetPairs:input_type -> google.protobuf.Empty + 89, // 74: boltzrpc.Boltz.GetPairs:input_type -> google.protobuf.Empty 32, // 75: boltzrpc.Boltz.ListSwaps:input_type -> boltzrpc.ListSwapsRequest 34, // 76: boltzrpc.Boltz.GetStats:input_type -> boltzrpc.GetStatsRequest 36, // 77: boltzrpc.Boltz.RefundSwap:input_type -> boltzrpc.RefundSwapRequest @@ -7403,57 +7534,59 @@ var file_boltzrpc_proto_depIdxs = []int32{ 61, // 89: boltzrpc.Boltz.GetSubaccounts:input_type -> boltzrpc.GetSubaccountsRequest 64, // 90: boltzrpc.Boltz.GetWallets:input_type -> boltzrpc.GetWalletsRequest 65, // 91: boltzrpc.Boltz.GetWallet:input_type -> boltzrpc.GetWalletRequest - 74, // 92: boltzrpc.Boltz.GetWalletSendFee:input_type -> boltzrpc.WalletSendRequest + 76, // 92: boltzrpc.Boltz.GetWalletSendFee:input_type -> boltzrpc.WalletSendRequest 67, // 93: boltzrpc.Boltz.ListWalletTransactions:input_type -> boltzrpc.ListWalletTransactionsRequest - 72, // 94: boltzrpc.Boltz.GetWalletCredentials:input_type -> boltzrpc.GetWalletCredentialsRequest - 73, // 95: boltzrpc.Boltz.RemoveWallet:input_type -> boltzrpc.RemoveWalletRequest - 74, // 96: boltzrpc.Boltz.WalletSend:input_type -> boltzrpc.WalletSendRequest - 76, // 97: boltzrpc.Boltz.WalletReceive:input_type -> boltzrpc.WalletReceiveRequest - 87, // 98: boltzrpc.Boltz.Stop:input_type -> google.protobuf.Empty - 83, // 99: boltzrpc.Boltz.Unlock:input_type -> boltzrpc.UnlockRequest - 84, // 100: boltzrpc.Boltz.VerifyWalletPassword:input_type -> boltzrpc.VerifyWalletPasswordRequest - 86, // 101: boltzrpc.Boltz.ChangeWalletPassword:input_type -> boltzrpc.ChangeWalletPasswordRequest - 6, // 102: boltzrpc.Boltz.CreateTenant:input_type -> boltzrpc.CreateTenantRequest - 7, // 103: boltzrpc.Boltz.ListTenants:input_type -> boltzrpc.ListTenantsRequest - 9, // 104: boltzrpc.Boltz.GetTenant:input_type -> boltzrpc.GetTenantRequest - 12, // 105: boltzrpc.Boltz.BakeMacaroon:input_type -> boltzrpc.BakeMacaroonRequest - 23, // 106: boltzrpc.Boltz.GetInfo:output_type -> boltzrpc.GetInfoResponse - 30, // 107: boltzrpc.Boltz.GetServiceInfo:output_type -> boltzrpc.GetServiceInfoResponse - 17, // 108: boltzrpc.Boltz.GetPairInfo:output_type -> boltzrpc.PairInfo - 26, // 109: boltzrpc.Boltz.GetPairs:output_type -> boltzrpc.GetPairsResponse - 33, // 110: boltzrpc.Boltz.ListSwaps:output_type -> boltzrpc.ListSwapsResponse - 35, // 111: boltzrpc.Boltz.GetStats:output_type -> boltzrpc.GetStatsResponse - 40, // 112: boltzrpc.Boltz.RefundSwap:output_type -> boltzrpc.GetSwapInfoResponse - 38, // 113: boltzrpc.Boltz.ClaimSwaps:output_type -> boltzrpc.ClaimSwapsResponse - 40, // 114: boltzrpc.Boltz.GetSwapInfo:output_type -> boltzrpc.GetSwapInfoResponse - 40, // 115: boltzrpc.Boltz.GetSwapInfoStream:output_type -> boltzrpc.GetSwapInfoResponse - 42, // 116: boltzrpc.Boltz.Deposit:output_type -> boltzrpc.DepositResponse - 44, // 117: boltzrpc.Boltz.CreateSwap:output_type -> boltzrpc.CreateSwapResponse - 44, // 118: boltzrpc.Boltz.CreateChannel:output_type -> boltzrpc.CreateSwapResponse - 47, // 119: boltzrpc.Boltz.CreateReverseSwap:output_type -> boltzrpc.CreateReverseSwapResponse - 49, // 120: boltzrpc.Boltz.CreateChainSwap:output_type -> boltzrpc.ChainSwapInfo - 59, // 121: boltzrpc.Boltz.CreateWallet:output_type -> boltzrpc.CreateWalletResponse - 78, // 122: boltzrpc.Boltz.ImportWallet:output_type -> boltzrpc.Wallet - 81, // 123: boltzrpc.Boltz.SetSubaccount:output_type -> boltzrpc.Subaccount - 62, // 124: boltzrpc.Boltz.GetSubaccounts:output_type -> boltzrpc.GetSubaccountsResponse - 79, // 125: boltzrpc.Boltz.GetWallets:output_type -> boltzrpc.Wallets - 78, // 126: boltzrpc.Boltz.GetWallet:output_type -> boltzrpc.Wallet - 66, // 127: boltzrpc.Boltz.GetWalletSendFee:output_type -> boltzrpc.WalletSendFee - 71, // 128: boltzrpc.Boltz.ListWalletTransactions:output_type -> boltzrpc.ListWalletTransactionsResponse - 55, // 129: boltzrpc.Boltz.GetWalletCredentials:output_type -> boltzrpc.WalletCredentials - 82, // 130: boltzrpc.Boltz.RemoveWallet:output_type -> boltzrpc.RemoveWalletResponse - 75, // 131: boltzrpc.Boltz.WalletSend:output_type -> boltzrpc.WalletSendResponse - 77, // 132: boltzrpc.Boltz.WalletReceive:output_type -> boltzrpc.WalletReceiveResponse - 87, // 133: boltzrpc.Boltz.Stop:output_type -> google.protobuf.Empty - 87, // 134: boltzrpc.Boltz.Unlock:output_type -> google.protobuf.Empty - 85, // 135: boltzrpc.Boltz.VerifyWalletPassword:output_type -> boltzrpc.VerifyWalletPasswordResponse - 87, // 136: boltzrpc.Boltz.ChangeWalletPassword:output_type -> google.protobuf.Empty - 10, // 137: boltzrpc.Boltz.CreateTenant:output_type -> boltzrpc.Tenant - 8, // 138: boltzrpc.Boltz.ListTenants:output_type -> boltzrpc.ListTenantsResponse - 10, // 139: boltzrpc.Boltz.GetTenant:output_type -> boltzrpc.Tenant - 13, // 140: boltzrpc.Boltz.BakeMacaroon:output_type -> boltzrpc.BakeMacaroonResponse - 106, // [106:141] is the sub-list for method output_type - 71, // [71:106] is the sub-list for method input_type + 69, // 94: boltzrpc.Boltz.BumpWalletTransaction:input_type -> boltzrpc.BumpWalletTransactionRequest + 74, // 95: boltzrpc.Boltz.GetWalletCredentials:input_type -> boltzrpc.GetWalletCredentialsRequest + 75, // 96: boltzrpc.Boltz.RemoveWallet:input_type -> boltzrpc.RemoveWalletRequest + 76, // 97: boltzrpc.Boltz.WalletSend:input_type -> boltzrpc.WalletSendRequest + 78, // 98: boltzrpc.Boltz.WalletReceive:input_type -> boltzrpc.WalletReceiveRequest + 89, // 99: boltzrpc.Boltz.Stop:input_type -> google.protobuf.Empty + 85, // 100: boltzrpc.Boltz.Unlock:input_type -> boltzrpc.UnlockRequest + 86, // 101: boltzrpc.Boltz.VerifyWalletPassword:input_type -> boltzrpc.VerifyWalletPasswordRequest + 88, // 102: boltzrpc.Boltz.ChangeWalletPassword:input_type -> boltzrpc.ChangeWalletPasswordRequest + 6, // 103: boltzrpc.Boltz.CreateTenant:input_type -> boltzrpc.CreateTenantRequest + 7, // 104: boltzrpc.Boltz.ListTenants:input_type -> boltzrpc.ListTenantsRequest + 9, // 105: boltzrpc.Boltz.GetTenant:input_type -> boltzrpc.GetTenantRequest + 12, // 106: boltzrpc.Boltz.BakeMacaroon:input_type -> boltzrpc.BakeMacaroonRequest + 23, // 107: boltzrpc.Boltz.GetInfo:output_type -> boltzrpc.GetInfoResponse + 30, // 108: boltzrpc.Boltz.GetServiceInfo:output_type -> boltzrpc.GetServiceInfoResponse + 17, // 109: boltzrpc.Boltz.GetPairInfo:output_type -> boltzrpc.PairInfo + 26, // 110: boltzrpc.Boltz.GetPairs:output_type -> boltzrpc.GetPairsResponse + 33, // 111: boltzrpc.Boltz.ListSwaps:output_type -> boltzrpc.ListSwapsResponse + 35, // 112: boltzrpc.Boltz.GetStats:output_type -> boltzrpc.GetStatsResponse + 40, // 113: boltzrpc.Boltz.RefundSwap:output_type -> boltzrpc.GetSwapInfoResponse + 38, // 114: boltzrpc.Boltz.ClaimSwaps:output_type -> boltzrpc.ClaimSwapsResponse + 40, // 115: boltzrpc.Boltz.GetSwapInfo:output_type -> boltzrpc.GetSwapInfoResponse + 40, // 116: boltzrpc.Boltz.GetSwapInfoStream:output_type -> boltzrpc.GetSwapInfoResponse + 42, // 117: boltzrpc.Boltz.Deposit:output_type -> boltzrpc.DepositResponse + 44, // 118: boltzrpc.Boltz.CreateSwap:output_type -> boltzrpc.CreateSwapResponse + 44, // 119: boltzrpc.Boltz.CreateChannel:output_type -> boltzrpc.CreateSwapResponse + 47, // 120: boltzrpc.Boltz.CreateReverseSwap:output_type -> boltzrpc.CreateReverseSwapResponse + 49, // 121: boltzrpc.Boltz.CreateChainSwap:output_type -> boltzrpc.ChainSwapInfo + 59, // 122: boltzrpc.Boltz.CreateWallet:output_type -> boltzrpc.CreateWalletResponse + 80, // 123: boltzrpc.Boltz.ImportWallet:output_type -> boltzrpc.Wallet + 83, // 124: boltzrpc.Boltz.SetSubaccount:output_type -> boltzrpc.Subaccount + 62, // 125: boltzrpc.Boltz.GetSubaccounts:output_type -> boltzrpc.GetSubaccountsResponse + 81, // 126: boltzrpc.Boltz.GetWallets:output_type -> boltzrpc.Wallets + 80, // 127: boltzrpc.Boltz.GetWallet:output_type -> boltzrpc.Wallet + 66, // 128: boltzrpc.Boltz.GetWalletSendFee:output_type -> boltzrpc.WalletSendFee + 73, // 129: boltzrpc.Boltz.ListWalletTransactions:output_type -> boltzrpc.ListWalletTransactionsResponse + 70, // 130: boltzrpc.Boltz.BumpWalletTransaction:output_type -> boltzrpc.BumpWalletTransactionResponse + 55, // 131: boltzrpc.Boltz.GetWalletCredentials:output_type -> boltzrpc.WalletCredentials + 84, // 132: boltzrpc.Boltz.RemoveWallet:output_type -> boltzrpc.RemoveWalletResponse + 77, // 133: boltzrpc.Boltz.WalletSend:output_type -> boltzrpc.WalletSendResponse + 79, // 134: boltzrpc.Boltz.WalletReceive:output_type -> boltzrpc.WalletReceiveResponse + 89, // 135: boltzrpc.Boltz.Stop:output_type -> google.protobuf.Empty + 89, // 136: boltzrpc.Boltz.Unlock:output_type -> google.protobuf.Empty + 87, // 137: boltzrpc.Boltz.VerifyWalletPassword:output_type -> boltzrpc.VerifyWalletPasswordResponse + 89, // 138: boltzrpc.Boltz.ChangeWalletPassword:output_type -> google.protobuf.Empty + 10, // 139: boltzrpc.Boltz.CreateTenant:output_type -> boltzrpc.Tenant + 8, // 140: boltzrpc.Boltz.ListTenants:output_type -> boltzrpc.ListTenantsResponse + 10, // 141: boltzrpc.Boltz.GetTenant:output_type -> boltzrpc.Tenant + 13, // 142: boltzrpc.Boltz.BakeMacaroon:output_type -> boltzrpc.BakeMacaroonResponse + 107, // [107:143] is the sub-list for method output_type + 71, // [71:107] is the sub-list for method input_type 71, // [71:71] is the sub-list for extension type_name 71, // [71:71] is the sub-list for extension extendee 0, // [0:71] is the sub-list for field type_name @@ -8222,7 +8355,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionInfo); i { + switch v := v.(*BumpWalletTransactionRequest); i { case 0: return &v.state case 1: @@ -8234,7 +8367,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionOutput); i { + switch v := v.(*BumpWalletTransactionResponse); i { case 0: return &v.state case 1: @@ -8246,7 +8379,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWalletTransactionsResponse); i { + switch v := v.(*TransactionInfo); i { case 0: return &v.state case 1: @@ -8258,7 +8391,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWalletCredentialsRequest); i { + switch v := v.(*TransactionOutput); i { case 0: return &v.state case 1: @@ -8270,7 +8403,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveWalletRequest); i { + switch v := v.(*ListWalletTransactionsResponse); i { case 0: return &v.state case 1: @@ -8282,7 +8415,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WalletSendRequest); i { + switch v := v.(*GetWalletCredentialsRequest); i { case 0: return &v.state case 1: @@ -8294,7 +8427,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WalletSendResponse); i { + switch v := v.(*RemoveWalletRequest); i { case 0: return &v.state case 1: @@ -8306,7 +8439,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WalletReceiveRequest); i { + switch v := v.(*WalletSendRequest); i { case 0: return &v.state case 1: @@ -8318,7 +8451,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WalletReceiveResponse); i { + switch v := v.(*WalletSendResponse); i { case 0: return &v.state case 1: @@ -8330,7 +8463,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Wallet); i { + switch v := v.(*WalletReceiveRequest); i { case 0: return &v.state case 1: @@ -8342,7 +8475,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Wallets); i { + switch v := v.(*WalletReceiveResponse); i { case 0: return &v.state case 1: @@ -8354,7 +8487,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Balance); i { + switch v := v.(*Wallet); i { case 0: return &v.state case 1: @@ -8366,7 +8499,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Subaccount); i { + switch v := v.(*Wallets); i { case 0: return &v.state case 1: @@ -8378,7 +8511,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveWalletResponse); i { + switch v := v.(*Balance); i { case 0: return &v.state case 1: @@ -8390,7 +8523,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnlockRequest); i { + switch v := v.(*Subaccount); i { case 0: return &v.state case 1: @@ -8402,7 +8535,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifyWalletPasswordRequest); i { + switch v := v.(*RemoveWalletResponse); i { case 0: return &v.state case 1: @@ -8414,7 +8547,7 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerifyWalletPasswordResponse); i { + switch v := v.(*UnlockRequest); i { case 0: return &v.state case 1: @@ -8426,6 +8559,30 @@ func file_boltzrpc_proto_init() { } } file_boltzrpc_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*VerifyWalletPasswordRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_boltzrpc_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*VerifyWalletPasswordResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_boltzrpc_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChangeWalletPasswordRequest); i { case 0: return &v.state @@ -8470,16 +8627,16 @@ func file_boltzrpc_proto_init() { file_boltzrpc_proto_msgTypes[58].OneofWrappers = []interface{}{} file_boltzrpc_proto_msgTypes[59].OneofWrappers = []interface{}{} file_boltzrpc_proto_msgTypes[61].OneofWrappers = []interface{}{} - file_boltzrpc_proto_msgTypes[63].OneofWrappers = []interface{}{} - file_boltzrpc_proto_msgTypes[66].OneofWrappers = []interface{}{} + file_boltzrpc_proto_msgTypes[65].OneofWrappers = []interface{}{} file_boltzrpc_proto_msgTypes[68].OneofWrappers = []interface{}{} + file_boltzrpc_proto_msgTypes[70].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_boltzrpc_proto_rawDesc, NumEnums: 6, - NumMessages: 81, + NumMessages: 83, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/boltzrpc/boltzrpc.proto b/pkg/boltzrpc/boltzrpc.proto index 00f5e539..beb4bc3b 100644 --- a/pkg/boltzrpc/boltzrpc.proto +++ b/pkg/boltzrpc/boltzrpc.proto @@ -133,6 +133,11 @@ service Boltz { */ rpc ListWalletTransactions (ListWalletTransactionsRequest) returns (ListWalletTransactionsResponse); + /* + Increase the fee of a wallet transaction using RBF. + */ + rpc BumpWalletTransaction (BumpWalletTransactionRequest) returns (BumpWalletTransactionResponse); + /* Returns the credentials of a wallet. The password will be required if the wallet is encrypted. */ @@ -800,6 +805,19 @@ message WalletTransaction { repeated TransactionInfo infos = 7; } +message BumpWalletTransactionRequest { + // id of the wallet which the transaction belongs to + uint64 id = 1; + // fee rate for the new transaction + double sat_per_vbyte = 2; + // id of the transaction to bump + string tx_id = 3; +} + +message BumpWalletTransactionResponse { + string tx_id = 1; +} + message TransactionInfo { // will be populated for LOCKUP, REFUND and CLAIM optional string swap_id = 1; diff --git a/pkg/boltzrpc/boltzrpc_grpc.pb.go b/pkg/boltzrpc/boltzrpc_grpc.pb.go index 2aeeda28..4102dda7 100644 --- a/pkg/boltzrpc/boltzrpc_grpc.pb.go +++ b/pkg/boltzrpc/boltzrpc_grpc.pb.go @@ -43,6 +43,7 @@ const ( Boltz_GetWallet_FullMethodName = "/boltzrpc.Boltz/GetWallet" Boltz_GetWalletSendFee_FullMethodName = "/boltzrpc.Boltz/GetWalletSendFee" Boltz_ListWalletTransactions_FullMethodName = "/boltzrpc.Boltz/ListWalletTransactions" + Boltz_BumpWalletTransaction_FullMethodName = "/boltzrpc.Boltz/BumpWalletTransaction" Boltz_GetWalletCredentials_FullMethodName = "/boltzrpc.Boltz/GetWalletCredentials" Boltz_RemoveWallet_FullMethodName = "/boltzrpc.Boltz/RemoveWallet" Boltz_WalletSend_FullMethodName = "/boltzrpc.Boltz/WalletSend" @@ -124,6 +125,8 @@ type BoltzClient interface { GetWalletSendFee(ctx context.Context, in *WalletSendRequest, opts ...grpc.CallOption) (*WalletSendFee, error) // Returns recent transactions from a wallet. ListWalletTransactions(ctx context.Context, in *ListWalletTransactionsRequest, opts ...grpc.CallOption) (*ListWalletTransactionsResponse, error) + // Increase the fee of a wallet transaction using RBF. + BumpWalletTransaction(ctx context.Context, in *BumpWalletTransactionRequest, opts ...grpc.CallOption) (*BumpWalletTransactionResponse, error) // Returns the credentials of a wallet. The password will be required if the wallet is encrypted. GetWalletCredentials(ctx context.Context, in *GetWalletCredentialsRequest, opts ...grpc.CallOption) (*WalletCredentials, error) // Removes a wallet. @@ -394,6 +397,15 @@ func (c *boltzClient) ListWalletTransactions(ctx context.Context, in *ListWallet return out, nil } +func (c *boltzClient) BumpWalletTransaction(ctx context.Context, in *BumpWalletTransactionRequest, opts ...grpc.CallOption) (*BumpWalletTransactionResponse, error) { + out := new(BumpWalletTransactionResponse) + err := c.cc.Invoke(ctx, Boltz_BumpWalletTransaction_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *boltzClient) GetWalletCredentials(ctx context.Context, in *GetWalletCredentialsRequest, opts ...grpc.CallOption) (*WalletCredentials, error) { out := new(WalletCredentials) err := c.cc.Invoke(ctx, Boltz_GetWalletCredentials_FullMethodName, in, out, opts...) @@ -569,6 +581,8 @@ type BoltzServer interface { GetWalletSendFee(context.Context, *WalletSendRequest) (*WalletSendFee, error) // Returns recent transactions from a wallet. ListWalletTransactions(context.Context, *ListWalletTransactionsRequest) (*ListWalletTransactionsResponse, error) + // Increase the fee of a wallet transaction using RBF. + BumpWalletTransaction(context.Context, *BumpWalletTransactionRequest) (*BumpWalletTransactionResponse, error) // Returns the credentials of a wallet. The password will be required if the wallet is encrypted. GetWalletCredentials(context.Context, *GetWalletCredentialsRequest) (*WalletCredentials, error) // Removes a wallet. @@ -672,6 +686,9 @@ func (UnimplementedBoltzServer) GetWalletSendFee(context.Context, *WalletSendReq func (UnimplementedBoltzServer) ListWalletTransactions(context.Context, *ListWalletTransactionsRequest) (*ListWalletTransactionsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListWalletTransactions not implemented") } +func (UnimplementedBoltzServer) BumpWalletTransaction(context.Context, *BumpWalletTransactionRequest) (*BumpWalletTransactionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method BumpWalletTransaction not implemented") +} func (UnimplementedBoltzServer) GetWalletCredentials(context.Context, *GetWalletCredentialsRequest) (*WalletCredentials, error) { return nil, status.Errorf(codes.Unimplemented, "method GetWalletCredentials not implemented") } @@ -1138,6 +1155,24 @@ func _Boltz_ListWalletTransactions_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _Boltz_BumpWalletTransaction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(BumpWalletTransactionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BoltzServer).BumpWalletTransaction(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Boltz_BumpWalletTransaction_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BoltzServer).BumpWalletTransaction(ctx, req.(*BumpWalletTransactionRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Boltz_GetWalletCredentials_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetWalletCredentialsRequest) if err := dec(in); err != nil { @@ -1449,6 +1484,10 @@ var Boltz_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListWalletTransactions", Handler: _Boltz_ListWalletTransactions_Handler, }, + { + MethodName: "BumpWalletTransaction", + Handler: _Boltz_BumpWalletTransaction_Handler, + }, { MethodName: "GetWalletCredentials", Handler: _Boltz_GetWalletCredentials_Handler, diff --git a/pkg/boltzrpc/client/client.go b/pkg/boltzrpc/client/client.go index 5fb30433..7430bd71 100644 --- a/pkg/boltzrpc/client/client.go +++ b/pkg/boltzrpc/client/client.go @@ -107,6 +107,10 @@ func (boltz *Boltz) ListWalletTransactions(request *boltzrpc.ListWalletTransacti return boltz.Client.ListWalletTransactions(boltz.Ctx, request) } +func (boltz *Boltz) BumpWalletTransaction(request *boltzrpc.BumpWalletTransactionRequest) (*boltzrpc.BumpWalletTransactionResponse, error) { + return boltz.Client.BumpWalletTransaction(boltz.Ctx, request) +} + func (boltz *Boltz) ImportWallet(params *boltzrpc.WalletParams, credentials *boltzrpc.WalletCredentials) (*boltzrpc.Wallet, error) { return boltz.Client.ImportWallet(boltz.Ctx, &boltzrpc.ImportWalletRequest{Params: params, Credentials: credentials}) } From 8b30d6dac2504e76097de75f43535a7cfd919308 Mon Sep 17 00:00:00 2001 From: jackstar12 Date: Tue, 11 Feb 2025 17:02:41 +0100 Subject: [PATCH 2/2] feat: `bumpfee` cli command --- cmd/boltzcli/commands.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/cmd/boltzcli/commands.go b/cmd/boltzcli/commands.go index df8de7e5..29ba8b44 100644 --- a/cmd/boltzcli/commands.go +++ b/cmd/boltzcli/commands.go @@ -1540,6 +1540,12 @@ var walletCommands = &cli.Command{ Action: requireNArgs(1, listTransactions), Flags: []cli.Flag{jsonFlag, &cli.BoolFlag{Name: "exclude-swap-related", Usage: "Exclude swap related transactions"}}, }, + { + Name: "bumpfee", + ArgsUsage: "name txid fee-rate", + Usage: "Bump the fee of a transaction", + Action: requireNArgs(3, bumpFee), + }, { Name: "subaccounts", Usage: "Show the subaccounts of a wallet", @@ -2036,6 +2042,29 @@ func listTransactions(ctx *cli.Context) error { return nil } +func bumpFee(ctx *cli.Context) error { + client := getClient(ctx) + walletId, err := getWalletId(ctx, ctx.Args().First()) + if err != nil { + return fmt.Errorf("wallet not found: %s", err) + } + txid := ctx.Args().Get(1) + feeRate, err := strconv.ParseFloat(ctx.Args().Get(2), 64) + if err != nil { + return fmt.Errorf("invalid fee rate: %s", err) + } + response, err := client.BumpWalletTransaction(&boltzrpc.BumpWalletTransactionRequest{ + Id: *walletId, + TxId: txid, + SatPerVbyte: feeRate, + }) + if err != nil { + return err + } + printJson(response) + return nil +} + var formatMacaroonCommand = &cli.Command{ Name: "formatmacaroon", Category: "Debug",