From 0f29607fc0464011a6fad7a204e89fb489eb1442 Mon Sep 17 00:00:00 2001 From: wwestgarth Date: Fri, 26 Apr 2024 13:44:10 +0100 Subject: [PATCH] feat: introduce AMM for future markets - phase 1 --- CHANGELOG.md | 4 + cmd/data-node/commands/start/node.go | 1 + .../commands/start/sqlsubscribers.go | 7 + commands/amend_amm.go | 129 + commands/amend_amm_test.go | 306 + commands/cancel_amm.go | 48 + commands/cancel_amm_test.go | 85 + commands/errors.go | 1 + commands/submit_amm.go | 149 + commands/submit_amm_test.go | 339 ++ commands/transaction.go | 6 + core/broker/broker_test.go | 2 +- core/broker/waiter_race_test.go | 23 + core/broker/waiter_test.go | 23 + core/collateral/engine.go | 276 + core/events/amm_pool.go | 91 + core/events/bus.go | 4 + core/events/transaction_result.go | 12 + core/execution/amm/engine.go | 999 ++++ core/execution/amm/engine_test.go | 855 +++ core/execution/amm/mocks/mocks.go | 334 ++ core/execution/amm/pool.go | 648 ++ core/execution/amm/pool_test.go | 401 ++ core/execution/common/amm_score_stake.go | 75 + core/execution/common/interfaces.go | 37 + core/execution/common/liquidity_provision.go | 90 +- .../common/liquidity_provision_fees.go | 143 +- .../common/liquidity_provision_snapshot.go | 112 + .../common/liquidity_provision_test.go | 275 +- .../common/market_activity_tracker.go | 43 +- .../market_activity_tracker_snapshot.go | 11 + .../common/market_activity_tracker_test.go | 41 + core/execution/common/mocks/mocks.go | 88 + core/execution/common/mocks_amm/mocks.go | 132 + core/execution/engine.go | 88 + core/execution/future/market.go | 81 +- core/execution/future/market_callbacks.go | 8 + core/execution/future/market_snapshot.go | 25 +- core/execution/spot/market.go | 16 +- core/execution/spot/market_callbacks.go | 4 + core/execution/spot/market_snapshot.go | 6 +- core/integration/docs/AMM.md | 210 + core/integration/execution_test.go | 48 +- ...tressed-trader-has-general-balance.feature | 1 + .../features/amm/0087-VAMM-001.feature | 103 + .../features/amm/0087-VAMM-002.feature | 104 + .../features/amm/0087-VAMM-003.feature | 104 + .../features/amm/0087-VAMM-004.feature | 132 + .../features/amm/0087-VAMM-005.feature | 165 + .../features/amm/0087-VAMM-006-014.feature | 490 ++ .../features/amm/0087-VAMM-015.feature | 117 + .../features/amm/0087-VAMM-016.feature | 160 + .../features/amm/0087-VAMM-019.feature | 158 + .../features/amm/0087-VAMM-020.feature | 361 ++ .../features/amm/0087-VAMM-021.feature | 406 ++ .../features/amm/0087-VAMM-022.feature | 141 + .../features/amm/0087-VAMM-023.feature | 150 + .../features/amm/0087-VAMM-024-026.feature | 204 + .../features/amm/0087-VAMM-031.feature | 165 + .../features/amm/0087-VAMM-032.feature | 164 + .../setting-fee-and-rewarding-lps.feature | 348 +- .../liquidity-provision/0042-LIQF-043.feature | 87 +- .../liquidity-provision/0044-LIME-020.feature | 15 +- .../liquidity-provision/0044-LIME-062.feature | 102 + .../liquidity_provision/0044-LIME-045.feature | 5 +- .../features/verified/0042-LIQF-SLA.feature | 83 +- .../verified/0042-LIQF-SLA_spot.feature | 3 + .../verified/0042-LIQF-fees_rewards.feature | 41 +- ...2-LIQF-fees_rewards_growing_market.feature | 11 +- .../0042-LIQF-fees_rewards_multi_lps.feature | 61 +- .../0042-LIQF-fees_rewards_rounding.feature | 121 +- ...042-LIQF-fees_rewards_with_decimal.feature | 15 +- .../features/verified/0044-LIME-SLA.feature | 93 + core/integration/main_test.go | 51 +- core/integration/setup_test.go | 8 + core/integration/steps/amm_accounts.go | 70 + core/integration/steps/amm_events.go | 232 + core/integration/steps/amm_submission.go | 291 + core/integration/steps/execution.go | 7 + core/integration/steps/network_params.go | 5 + ...uld_have_the_following_account_balances.go | 59 +- ...ould_have_the_following_profit_and_loss.go | 28 +- core/integration/steps/table_wrapper.go | 44 + .../steps/the_following_trades_happened.go | 15 +- .../the_following_transfers_should_happen.go | 23 + core/integration/steps/transfers.go | 2 + .../steps/volume_discount_program.go | 17 + core/integration/stubs/broker_stub.go | 85 + core/limits/engine.go | 15 +- core/limits/snapshot.go | 2 + core/liquidity/v2/scores.go | 5 + core/liquidity/v2/types.go | 8 + core/matching/cached_orderbook.go | 4 + core/matching/helpers_test.go | 1 - core/matching/mocks/mocks.go | 79 + core/matching/orderbook.go | 136 +- core/matching/orderbook_amm_test.go | 336 ++ core/matching/orderbook_test.go | 1 - core/matching/side.go | 124 +- core/matching/side_test.go | 24 +- core/netparams/defaults.go | 6 + core/netparams/keys.go | 7 + core/positions/engine.go | 1 - core/processor/abci.go | 50 + core/processor/mocks/mocks.go | 56 + core/processor/processor.go | 5 + core/processor/tx.go | 30 + core/protocol/all_services.go | 12 + core/risk/engine.go | 8 + core/txn/command.go | 9 + core/types/amm.go | 357 ++ core/types/matching.go | 57 +- core/types/snapshot_nodes.go | 6 + core/types/transfer.go | 4 + datanode/api/errors.go | 2 + datanode/api/server.go | 4 + datanode/api/trading_data_v2.go | 45 + datanode/api/trading_test.go | 2 + datanode/broker/convert.go | 2 + datanode/entities/amm_pool.go | 169 + datanode/entities/entities.go | 2 +- datanode/entities/enums.go | 65 + datanode/entities/id.go | 7 + datanode/gateway/graphql/generated.go | 2430 ++++++-- datanode/gateway/graphql/gqlgen.yml | 12 + .../graphql/marshallers/marshallers.go | 40 + datanode/gateway/graphql/mocks/mocks.go | 20 + datanode/gateway/graphql/resolvers.go | 19 + datanode/gateway/graphql/schema.graphql | 100 + datanode/networkhistory/service_test.go | 12 +- datanode/service/stubs.go | 5 + datanode/sqlstore/amm_pool.go | 153 + datanode/sqlstore/amm_pool_test.go | 754 +++ .../sqlstore/migrations/0107_amm_pools.sql | 48 + datanode/sqlsubscribers/amm_pool.go | 67 + libs/num/uint.go | 5 + libs/num/uint_test.go | 7 + protos/data-node/api/v2/trading_data.pb.go | 3250 +++++----- protos/data-node/api/v2/trading_data.pb.gw.go | 83 + .../data-node/api/v2/trading_data_grpc.pb.go | 42 + protos/embed_test.go | 2 +- .../data-node/api/v2/trading_data.proto | 43 + .../sources/data-node/grpc-rest-bindings.yml | 2 + .../vega/checkpoint/v1/checkpoint.proto | 2 + .../sources/vega/commands/v1/commands.proto | 69 + .../vega/commands/v1/transaction.proto | 7 + protos/sources/vega/events/v1/events.proto | 73 + .../sources/vega/snapshot/v1/snapshot.proto | 47 + protos/sources/vega/vega.proto | 10 + protos/sources/vega/wallet/v1/wallet.proto | 3 + protos/vega/checkpoint/v1/checkpoint.pb.go | 356 +- protos/vega/commands/v1/commands.pb.go | 832 ++- protos/vega/commands/v1/transaction.pb.go | 297 +- protos/vega/events/v1/events.pb.go | 3791 +++++++----- protos/vega/snapshot/v1/snapshot.pb.go | 5255 +++++++++-------- protos/vega/vega.pb.go | 206 +- protos/vega/wallet/v1/wallet.pb.go | 236 +- wallet/commands/commands.go | 18 + 158 files changed, 24557 insertions(+), 6703 deletions(-) create mode 100644 commands/amend_amm.go create mode 100644 commands/amend_amm_test.go create mode 100644 commands/cancel_amm.go create mode 100644 commands/cancel_amm_test.go create mode 100644 commands/submit_amm.go create mode 100644 commands/submit_amm_test.go create mode 100644 core/broker/waiter_race_test.go create mode 100644 core/broker/waiter_test.go create mode 100644 core/events/amm_pool.go create mode 100644 core/execution/amm/engine.go create mode 100644 core/execution/amm/engine_test.go create mode 100644 core/execution/amm/mocks/mocks.go create mode 100644 core/execution/amm/pool.go create mode 100644 core/execution/amm/pool_test.go create mode 100644 core/execution/common/amm_score_stake.go create mode 100644 core/execution/common/liquidity_provision_snapshot.go create mode 100644 core/execution/common/mocks_amm/mocks.go create mode 100644 core/integration/docs/AMM.md create mode 100644 core/integration/features/amm/0087-VAMM-001.feature create mode 100644 core/integration/features/amm/0087-VAMM-002.feature create mode 100644 core/integration/features/amm/0087-VAMM-003.feature create mode 100644 core/integration/features/amm/0087-VAMM-004.feature create mode 100644 core/integration/features/amm/0087-VAMM-005.feature create mode 100644 core/integration/features/amm/0087-VAMM-006-014.feature create mode 100644 core/integration/features/amm/0087-VAMM-015.feature create mode 100644 core/integration/features/amm/0087-VAMM-016.feature create mode 100644 core/integration/features/amm/0087-VAMM-019.feature create mode 100644 core/integration/features/amm/0087-VAMM-020.feature create mode 100644 core/integration/features/amm/0087-VAMM-021.feature create mode 100644 core/integration/features/amm/0087-VAMM-022.feature create mode 100644 core/integration/features/amm/0087-VAMM-023.feature create mode 100644 core/integration/features/amm/0087-VAMM-024-026.feature create mode 100644 core/integration/features/amm/0087-VAMM-031.feature create mode 100644 core/integration/features/amm/0087-VAMM-032.feature create mode 100644 core/integration/steps/amm_accounts.go create mode 100644 core/integration/steps/amm_events.go create mode 100644 core/integration/steps/amm_submission.go create mode 100644 core/matching/mocks/mocks.go create mode 100644 core/matching/orderbook_amm_test.go create mode 100644 core/types/amm.go create mode 100644 datanode/entities/amm_pool.go create mode 100644 datanode/sqlstore/amm_pool.go create mode 100644 datanode/sqlstore/amm_pool_test.go create mode 100644 datanode/sqlstore/migrations/0107_amm_pools.sql create mode 100644 datanode/sqlsubscribers/amm_pool.go diff --git a/CHANGELOG.md b/CHANGELOG.md index a47d2d2e138..60e96c50263 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -165,6 +165,7 @@ - [10702](https://github.com/vegaprotocol/vega/pull/10700) - Use second precision in `GetMarginIncrease()` so that perpetual product uses second precision everywhere. - [10698](https://github.com/vegaprotocol/vega/issues/10698) - Prevent `L2` from making too many `RPC` calls. +- [971](https://github.com/vegaprotocol/core-test-coverage/issues/971) - Add `AMM` support to the integration test framework. ## 0.74.2 @@ -199,6 +200,9 @@ - [10611](https://github.com/vegaprotocol/vega/issues/10611) - Added internal config price to update `perps`. - [10615](https://github.com/vegaprotocol/vega/issues/10615) - Fix oracle scaling function in internal composite price. - [10621](https://github.com/vegaprotocol/vega/issues/10621) - Fix market activity tracker storing incorrect data for previous `epochMakerFeesPaid`. +- [10643](https://github.com/vegaprotocol/vega/issues/10643) - Games `API` not showing quantum values and added filter for team and party. + +## 0.74.0 ### 🚨 Breaking changes diff --git a/cmd/data-node/commands/start/node.go b/cmd/data-node/commands/start/node.go index e4472246656..5be944c3db1 100644 --- a/cmd/data-node/commands/start/node.go +++ b/cmd/data-node/commands/start/node.go @@ -240,6 +240,7 @@ func (l *NodeCommand) createGRPCServer(config api.Config) *api.GRPCServer { l.gamesService, l.marginModesService, l.timeWeightedNotionalPositionService, + l.ammPoolsService, ) return grpcServer } diff --git a/cmd/data-node/commands/start/sqlsubscribers.go b/cmd/data-node/commands/start/sqlsubscribers.go index 8b1afa14e4f..9840a8b5fc9 100644 --- a/cmd/data-node/commands/start/sqlsubscribers.go +++ b/cmd/data-node/commands/start/sqlsubscribers.go @@ -82,6 +82,7 @@ type SQLSubscribers struct { gamesStore *sqlstore.Games marginModesStore *sqlstore.MarginModes timeWeightedNotionalPositionStore *sqlstore.TimeWeightedNotionalPosition + ammPoolsStore *sqlstore.AMMPools // Services candleService *candlesv2.Svc @@ -138,6 +139,7 @@ type SQLSubscribers struct { gamesService *service.Games marginModesService *service.MarginModes timeWeightedNotionalPositionService *service.TimeWeightedNotionalPosition + ammPoolsService *service.AMMPools // Subscribers accountSub *sqlsubscribers.Account @@ -190,6 +192,7 @@ type SQLSubscribers struct { transactionResultsSub *sqlsubscribers.TransactionResults marginModesSub *sqlsubscribers.MarginModes timeWeightedNotionalPositionSub *sqlsubscribers.TimeWeightedNotionalPosition + ammPoolsSub *sqlsubscribers.AMMPools } func (s *SQLSubscribers) GetSQLSubscribers() []broker.SQLBrokerSubscriber { @@ -246,6 +249,7 @@ func (s *SQLSubscribers) GetSQLSubscribers() []broker.SQLBrokerSubscriber { s.transactionResultsSub, s.marginModesSub, s.timeWeightedNotionalPositionSub, + s.ammPoolsSub, } } @@ -307,6 +311,7 @@ func (s *SQLSubscribers) CreateAllStores(ctx context.Context, Log *logging.Logge s.gamesStore = sqlstore.NewGames(transactionalConnectionSource) s.marginModesStore = sqlstore.NewMarginModes(transactionalConnectionSource) s.timeWeightedNotionalPositionStore = sqlstore.NewTimeWeightedNotionalPosition(transactionalConnectionSource) + s.ammPoolsStore = sqlstore.NewAMMPools(transactionalConnectionSource) } func (s *SQLSubscribers) SetupServices(ctx context.Context, log *logging.Logger, candlesConfig candlesv2.Config) error { @@ -363,6 +368,7 @@ func (s *SQLSubscribers) SetupServices(ctx context.Context, log *logging.Logger, s.gamesService = service.NewGames(s.gamesStore) s.marginModesService = service.NewMarginModes(s.marginModesStore) s.timeWeightedNotionalPositionService = service.NewTimeWeightedNotionalPosition(s.timeWeightedNotionalPositionStore) + s.ammPoolsService = service.NewAMMPools(s.ammPoolsStore) s.transactionResultsSub = sqlsubscribers.NewTransactionResults(log) s.transactionResultsService = service.NewTransactionResults(s.transactionResultsSub) @@ -432,4 +438,5 @@ func (s *SQLSubscribers) SetupSQLSubscribers() { s.vestingSummarySub = sqlsubscribers.NewVestingBalancesSummary(s.partyVestingBalancesStore, s.partyLockedBalancesStore) s.marginModesSub = sqlsubscribers.NewMarginModes(s.marginModesService) s.timeWeightedNotionalPositionSub = sqlsubscribers.NewTimeWeightedNotionalPosition(s.timeWeightedNotionalPositionService) + s.ammPoolsSub = sqlsubscribers.NewAMMPools(s.ammPoolsService) } diff --git a/commands/amend_amm.go b/commands/amend_amm.go new file mode 100644 index 00000000000..2ac374bf226 --- /dev/null +++ b/commands/amend_amm.go @@ -0,0 +1,129 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package commands + +import ( + "math/big" + + "code.vegaprotocol.io/vega/libs/num" + commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" +) + +func CheckAmendAMM(cmd *commandspb.AmendAMM) error { + return checkAmendAMM(cmd).ErrorOrNil() +} + +func checkAmendAMM(cmd *commandspb.AmendAMM) Errors { + errs := NewErrors() + + if cmd == nil { + return errs.FinalAddForProperty("amend_amm", ErrIsRequired) + } + + if len(cmd.MarketId) <= 0 { + errs.AddForProperty("amend_amm.market_id", ErrIsRequired) + } else if !IsVegaID(cmd.MarketId) { + errs.AddForProperty("amend_amm.market_id", ErrShouldBeAValidVegaID) + } + + if len(cmd.SlippageTolerance) <= 0 { + errs.AddForProperty("amend_amm.slippage_tolerance", ErrIsRequired) + } else if slippageTolerance, err := num.DecimalFromString(cmd.SlippageTolerance); err != nil { + errs.AddForProperty("amend_amm.slippage_tolerance", ErrIsNotValidNumber) + } else if slippageTolerance.LessThanOrEqual(num.DecimalZero()) || slippageTolerance.GreaterThan(num.DecimalOne()) { + errs.AddForProperty("amend_amm.slippage_tolerance", ErrMustBeBetween01) + } + + var hasUpdate bool + + if cmd.CommitmentAmount != nil { + hasUpdate = true + if amount, _ := big.NewInt(0).SetString(*cmd.CommitmentAmount, 10); amount == nil { + errs.FinalAddForProperty("amend_amm.commitment_amount", ErrIsNotValidNumber) + } else if amount.Cmp(big.NewInt(0)) <= 0 { + errs.AddForProperty("amend_amm.commitment_amount", ErrMustBePositive) + } + } + + if cmd.ProposedFee != nil { + hasUpdate = true + if proposedFee, err := num.DecimalFromString(*cmd.ProposedFee); err != nil { + errs.AddForProperty("amend_amm.proposed_fee", ErrIsNotValid) + } else if proposedFee.LessThanOrEqual(num.DecimalZero()) { + errs.AddForProperty("amend_amm.proposed_fee", ErrMustBePositive) + } + } + + if cmd.ConcentratedLiquidityParameters != nil { + if cmd.ConcentratedLiquidityParameters.Base != nil { + hasUpdate = true + if amount, _ := big.NewInt(0).SetString(*cmd.ConcentratedLiquidityParameters.Base, 10); amount == nil { + errs.FinalAddForProperty("amend_amm.concentrated_liquidity_parameters.base", ErrIsNotValidNumber) + } else if amount.Cmp(big.NewInt(0)) <= 0 { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.base", ErrMustBePositive) + } + } + if cmd.ConcentratedLiquidityParameters.LowerBound != nil { + hasUpdate = true + if amount, _ := big.NewInt(0).SetString(*cmd.ConcentratedLiquidityParameters.LowerBound, 10); amount == nil { + errs.FinalAddForProperty("amend_amm.concentrated_liquidity_parameters.lower_bound", ErrIsNotValidNumber) + } else if amount.Cmp(big.NewInt(0)) <= 0 { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.lower_bound", ErrMustBePositive) + } + } + if cmd.ConcentratedLiquidityParameters.UpperBound != nil { + hasUpdate = true + if amount, _ := big.NewInt(0).SetString(*cmd.ConcentratedLiquidityParameters.UpperBound, 10); amount == nil { + errs.FinalAddForProperty("amend_amm.concentrated_liquidity_parameters.upper_bound", ErrIsNotValidNumber) + } else if amount.Cmp(big.NewInt(0)) <= 0 { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.upper_bound", ErrMustBePositive) + } + } + + if cmd.ConcentratedLiquidityParameters.MarginRatioAtUpperBound != nil { + hasUpdate = true + if marginRatio, err := num.DecimalFromString(*cmd.ConcentratedLiquidityParameters.MarginRatioAtUpperBound); err != nil { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.margin_ratio_at_upper_bound", ErrIsNotValidNumber) + } else if marginRatio.LessThan(num.DecimalZero()) { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.margin_ratio_at_upper_bound", ErrMustBePositive) + } + } + + if cmd.ConcentratedLiquidityParameters.MarginRatioAtLowerBound != nil { + hasUpdate = true + if marginRatio, err := num.DecimalFromString(*cmd.ConcentratedLiquidityParameters.MarginRatioAtLowerBound); err != nil { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.margin_ratio_at_lower_bound", ErrIsNotValidNumber) + } else if marginRatio.LessThan(num.DecimalZero()) { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.margin_ratio_at_lower_bound", ErrMustBePositive) + } + } + + if len(cmd.SlippageTolerance) <= 0 { + errs.AddForProperty("submit_amm.slippage_tolerance", ErrIsRequired) + } else if slippageTolerance, err := num.DecimalFromString(cmd.SlippageTolerance); err != nil { + errs.AddForProperty("submit_amm.slippage_tolerance", ErrIsNotValidNumber) + } else if slippageTolerance.LessThan(num.DecimalZero()) { + errs.AddForProperty("submit_amm.slippage_tolerance", ErrMustBePositive) + } + } + + // no update, but also no error, invalid + if !hasUpdate && errs.Empty() { + errs.FinalAdd(ErrNoUpdatesProvided) + } + + return errs +} diff --git a/commands/amend_amm_test.go b/commands/amend_amm_test.go new file mode 100644 index 00000000000..4be14319d1d --- /dev/null +++ b/commands/amend_amm_test.go @@ -0,0 +1,306 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package commands_test + +import ( + "errors" + "testing" + + "code.vegaprotocol.io/vega/commands" + "code.vegaprotocol.io/vega/libs/ptr" + commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" + + "github.com/stretchr/testify/assert" +) + +func TestCheckAmendAMM(t *testing.T) { + cases := []struct { + submission commandspb.AmendAMM + errStr string + }{ + { + submission: commandspb.AmendAMM{}, + errStr: "amend_amm.market_id (is required)", + }, + { + submission: commandspb.AmendAMM{ + MarketId: "notavalidmarketid", + }, + errStr: "amend_amm.market_id (should be a valid Vega ID)", + }, + { + submission: commandspb.AmendAMM{ + SlippageTolerance: "", + }, + errStr: "amend_amm.slippage_tolerance (is required)", + }, + { + submission: commandspb.AmendAMM{ + SlippageTolerance: "abc", + }, + errStr: "amend_amm.slippage_tolerance (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + SlippageTolerance: "-0.5", + }, + errStr: "amend_amm.slippage_tolerance (must be between 0 (excluded) and 1 (included))", + }, + { + submission: commandspb.AmendAMM{ + SlippageTolerance: "0", + }, + errStr: "amend_amm.slippage_tolerance (must be between 0 (excluded) and 1 (included))", + }, + { + submission: commandspb.AmendAMM{ + SlippageTolerance: "2", + }, + errStr: "amend_amm.slippage_tolerance (must be between 0 (excluded) and 1 (included))", + }, + { + submission: commandspb.AmendAMM{ + CommitmentAmount: ptr.From(""), + }, + errStr: "amend_amm.commitment_amount (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + CommitmentAmount: ptr.From("abc"), + }, + errStr: "amend_amm.commitment_amount (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + CommitmentAmount: ptr.From("-10"), + }, + errStr: "amend_amm.commitment_amount (must be positive)", + }, + { + submission: commandspb.AmendAMM{ + CommitmentAmount: ptr.From("0"), + }, + errStr: "amend_amm.commitment_amount (must be positive)", + }, + { + submission: commandspb.AmendAMM{ + ProposedFee: ptr.From(""), + }, + errStr: "amend_amm.proposed_fee (is not a valid value)", + }, + { + submission: commandspb.AmendAMM{ + ProposedFee: ptr.From("abc"), + }, + errStr: "amend_amm.proposed_fee (is not a valid value)", + }, + { + submission: commandspb.AmendAMM{ + ProposedFee: ptr.From("-10"), + }, + errStr: "amend_amm.proposed_fee (must be positive)", + }, + { + submission: commandspb.AmendAMM{ + ProposedFee: ptr.From("0"), + }, + errStr: "amend_amm.proposed_fee (must be positive)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + Base: ptr.From(""), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.base (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + Base: ptr.From("abc"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.base (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + Base: ptr.From("-10"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.base (must be positive)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + Base: ptr.From("0"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.base (must be positive)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + LowerBound: ptr.From(""), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.lower_bound (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + LowerBound: ptr.From("abc"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.lower_bound (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + LowerBound: ptr.From("-10"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.lower_bound (must be positive)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + LowerBound: ptr.From("0"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.lower_bound (must be positive)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + UpperBound: ptr.From(""), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.upper_bound (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + UpperBound: ptr.From("abc"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.upper_bound (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + UpperBound: ptr.From("-10"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.upper_bound (must be positive)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + UpperBound: ptr.From("0"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.upper_bound (must be positive)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + MarginRatioAtUpperBound: ptr.From(""), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.margin_ratio_at_upper_bound (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + MarginRatioAtUpperBound: ptr.From("abc"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.margin_ratio_at_upper_bound (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + MarginRatioAtUpperBound: ptr.From("-10"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.margin_ratio_at_upper_bound (must be positive)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + MarginRatioAtLowerBound: ptr.From(""), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.margin_ratio_at_lower_bound (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + MarginRatioAtLowerBound: ptr.From("abc"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.margin_ratio_at_lower_bound (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + MarginRatioAtLowerBound: ptr.From("-10"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.margin_ratio_at_lower_bound (must be positive)", + }, + { + submission: commandspb.AmendAMM{ + MarketId: "e9982447fb4128f9968f9981612c5ea85d19b62058ec2636efc812dcbbc745ca", + SlippageTolerance: "0.09", + }, + errStr: "* (no updates provided)", + }, + { + submission: commandspb.AmendAMM{ + MarketId: "e9982447fb4128f9968f9981612c5ea85d19b62058ec2636efc812dcbbc745ca", + SlippageTolerance: "0.09", + CommitmentAmount: ptr.From("10000"), + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + Base: ptr.From("20000"), + UpperBound: ptr.From("30000"), + LowerBound: ptr.From("10000"), + }, + }, + }, + } + + for n, c := range cases { + if len(c.errStr) <= 0 { + assert.NoError(t, commands.CheckAmendAMM(&c.submission), n) + continue + } + + assert.Contains(t, checkAmendAMM(&c.submission).Error(), c.errStr, n) + } +} + +func checkAmendAMM(cmd *commandspb.AmendAMM) commands.Errors { + err := commands.CheckAmendAMM(cmd) + + var e commands.Errors + if ok := errors.As(err, &e); !ok { + return commands.NewErrors() + } + + return e +} diff --git a/commands/cancel_amm.go b/commands/cancel_amm.go new file mode 100644 index 00000000000..6524f32fa0a --- /dev/null +++ b/commands/cancel_amm.go @@ -0,0 +1,48 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package commands + +import ( + commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" +) + +func CheckCancelAMM(cmd *commandspb.CancelAMM) error { + return checkCancelAMM(cmd).ErrorOrNil() +} + +func checkCancelAMM(cmd *commandspb.CancelAMM) Errors { + errs := NewErrors() + + if cmd == nil { + return errs.FinalAddForProperty("cancel_amm", ErrIsRequired) + } + + if len(cmd.MarketId) <= 0 { + errs.AddForProperty("cancel_amm.market_id", ErrIsRequired) + } else if !IsVegaID(cmd.MarketId) { + errs.AddForProperty("cancel_amm.market_id", ErrShouldBeAValidVegaID) + } + + if cmd.Method == commandspb.CancelAMM_METHOD_UNSPECIFIED { + errs.AddForProperty("cancel_amm.method", ErrIsRequired) + } + + if _, ok := commandspb.CancelAMM_Method_name[int32(cmd.Method)]; !ok { + errs.AddForProperty("cancel_amm.method", ErrIsNotValid) + } + + return errs +} diff --git a/commands/cancel_amm_test.go b/commands/cancel_amm_test.go new file mode 100644 index 00000000000..62ea9dddbc7 --- /dev/null +++ b/commands/cancel_amm_test.go @@ -0,0 +1,85 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package commands_test + +import ( + "errors" + "testing" + + "code.vegaprotocol.io/vega/commands" + commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" + + "github.com/stretchr/testify/assert" +) + +func TestCheckCancelAMM(t *testing.T) { + cases := []struct { + submission commandspb.CancelAMM + errStr string + }{ + { + submission: commandspb.CancelAMM{}, + errStr: "cancel_amm.market_id (is required)", + }, + { + submission: commandspb.CancelAMM{ + MarketId: "notavalidmarketid", + Method: commandspb.CancelAMM_METHOD_IMMEDIATE, + }, + errStr: "cancel_amm.market_id (should be a valid Vega ID)", + }, + { + submission: commandspb.CancelAMM{ + MarketId: "e9982447fb4128f9968f9981612c5ea85d19b62058ec2636efc812dcbbc745ca", + Method: commandspb.CancelAMM_METHOD_IMMEDIATE, + }, + }, + { + submission: commandspb.CancelAMM{ + MarketId: "e9982447fb4128f9968f9981612c5ea85d19b62058ec2636efc812dcbbc745ca", + Method: commandspb.CancelAMM_METHOD_UNSPECIFIED, + }, + errStr: "cancel_amm.method (is required)", + }, + { + submission: commandspb.CancelAMM{ + MarketId: "e9982447fb4128f9968f9981612c5ea85d19b62058ec2636efc812dcbbc745ca", + Method: commandspb.CancelAMM_Method(999), + }, + errStr: "cancel_amm.method (is not a valid value)", + }, + } + + for n, c := range cases { + if len(c.errStr) <= 0 { + assert.NoError(t, commands.CheckCancelAMM(&c.submission), n) + continue + } + + assert.Contains(t, checkCancelAMM(&c.submission).Error(), c.errStr, n) + } +} + +func checkCancelAMM(cmd *commandspb.CancelAMM) commands.Errors { + err := commands.CheckCancelAMM(cmd) + + var e commands.Errors + if ok := errors.As(err, &e); !ok { + return commands.NewErrors() + } + + return e +} diff --git a/commands/errors.go b/commands/errors.go index f1c3cccc52c..41fcd66408f 100644 --- a/commands/errors.go +++ b/commands/errors.go @@ -93,6 +93,7 @@ var ( ErrIsDuplicated = errors.New("is duplicated") ErrIsDisabled = errors.New("is disabled") ErrMustBeAtMost250 = errors.New("must be at most 250") + ErrNoUpdatesProvided = errors.New("no updates provided") ) type Errors map[string][]error diff --git a/commands/submit_amm.go b/commands/submit_amm.go new file mode 100644 index 00000000000..6c4b07aaebf --- /dev/null +++ b/commands/submit_amm.go @@ -0,0 +1,149 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package commands + +import ( + "errors" + "math/big" + + "code.vegaprotocol.io/vega/libs/num" + commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" +) + +func CheckSubmitAMM(cmd *commandspb.SubmitAMM) error { + return checkSubmitAMM(cmd).ErrorOrNil() +} + +func checkSubmitAMM(cmd *commandspb.SubmitAMM) Errors { + errs := NewErrors() + + if cmd == nil { + return errs.FinalAddForProperty("submit_amm", ErrIsRequired) + } + + if len(cmd.MarketId) <= 0 { + errs.AddForProperty("submit_amm.market_id", ErrIsRequired) + } else if !IsVegaID(cmd.MarketId) { + errs.AddForProperty("submit_amm.market_id", ErrShouldBeAValidVegaID) + } + + if len(cmd.SlippageTolerance) <= 0 { + errs.AddForProperty("submit_amm.slippage_tolerance", ErrIsRequired) + } else if slippageTolerance, err := num.DecimalFromString(cmd.SlippageTolerance); err != nil { + errs.AddForProperty("submit_amm.slippage_tolerance", ErrIsNotValidNumber) + } else if slippageTolerance.LessThanOrEqual(num.DecimalZero()) || slippageTolerance.GreaterThan(num.DecimalOne()) { + errs.AddForProperty("submit_amm.slippage_tolerance", ErrMustBeBetween01) + } + + if len(cmd.CommitmentAmount) <= 0 { + errs.FinalAddForProperty("submit_amm.commitment_amount", ErrIsRequired) + } else if amount, _ := big.NewInt(0).SetString(cmd.CommitmentAmount, 10); amount == nil { + errs.FinalAddForProperty("submit_amm.commitment_amount", ErrIsNotValidNumber) + } else if amount.Cmp(big.NewInt(0)) <= 0 { + errs.AddForProperty("submit_amm.commitment_amount", ErrMustBePositive) + } + + if len(cmd.ProposedFee) <= 0 { + errs.AddForProperty("submit_amm.proposed_fee", ErrIsRequired) + } else if proposedFee, err := num.DecimalFromString(cmd.ProposedFee); err != nil { + errs.AddForProperty("submit_amm.proposed_fee", ErrIsNotValid) + } else if proposedFee.LessThanOrEqual(num.DecimalZero()) { + errs.AddForProperty("submit_amm.proposed_fee", ErrMustBePositive) + } + + if cmd.ConcentratedLiquidityParameters == nil { + errs.FinalAddForProperty("submit_amm.concentrated_liquidity_parameters", ErrIsRequired) + } else { + var base, lowerBound, upperBound *big.Int + + if len(cmd.ConcentratedLiquidityParameters.Base) <= 0 { + errs.FinalAddForProperty("submit_amm.concentrated_liquidity_parameters.base", ErrIsRequired) + } else if base, _ = big.NewInt(0).SetString(cmd.ConcentratedLiquidityParameters.Base, 10); base == nil { + errs.FinalAddForProperty("submit_amm.concentrated_liquidity_parameters.base", ErrIsNotValidNumber) + } else if base.Cmp(big.NewInt(0)) <= 0 { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.base", ErrMustBePositive) + } + + var emptyLower, emptyUpper bool + if cmd.ConcentratedLiquidityParameters.LowerBound == nil { + emptyLower = true + } else if len(*cmd.ConcentratedLiquidityParameters.LowerBound) <= 0 { + errs.FinalAddForProperty("submit_amm.concentrated_liquidity_parameters.lower_bound", ErrIsNotValidNumber) + } else if lowerBound, _ = big.NewInt(0).SetString(*cmd.ConcentratedLiquidityParameters.LowerBound, 10); lowerBound == nil { + errs.FinalAddForProperty("submit_amm.concentrated_liquidity_parameters.lower_bound", ErrIsNotValidNumber) + } else if lowerBound.Cmp(big.NewInt(0)) <= 0 { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.lower_bound", ErrMustBePositive) + } + + if cmd.ConcentratedLiquidityParameters.UpperBound == nil { + emptyUpper = true + } else if len(*cmd.ConcentratedLiquidityParameters.UpperBound) <= 0 { + errs.FinalAddForProperty("submit_amm.concentrated_liquidity_parameters.upper_bound", ErrIsNotValidNumber) + } else if upperBound, _ = big.NewInt(0).SetString(*cmd.ConcentratedLiquidityParameters.UpperBound, 10); upperBound == nil { + errs.FinalAddForProperty("submit_amm.concentrated_liquidity_parameters.upper_bound", ErrIsNotValidNumber) + } else if upperBound.Cmp(big.NewInt(0)) <= 0 { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.upper_bound", ErrMustBePositive) + } + + if emptyLower && emptyUpper { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.lower_bound", errors.New("lower_bound and upper_bound cannot both be empty")) + } + + if cmd.ConcentratedLiquidityParameters.MarginRatioAtUpperBound == nil { + if !emptyUpper { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.margin_ratio_at_upper_bound", ErrIsRequired) + } + } else if len(*cmd.ConcentratedLiquidityParameters.MarginRatioAtUpperBound) <= 0 { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.margin_ratio_at_upper_bound", ErrIsNotValidNumber) + } else if marginRatio, err := num.DecimalFromString(*cmd.ConcentratedLiquidityParameters.MarginRatioAtUpperBound); err != nil { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.margin_ratio_at_upper_bound", ErrIsNotValidNumber) + } else if marginRatio.LessThan(num.DecimalZero()) { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.margin_ratio_at_upper_bound", ErrMustBePositive) + } + + if cmd.ConcentratedLiquidityParameters.MarginRatioAtLowerBound == nil { + if !emptyLower { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.margin_ratio_at_lower_bound", ErrIsRequired) + } + } else if len(*cmd.ConcentratedLiquidityParameters.MarginRatioAtLowerBound) <= 0 { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.margin_ratio_at_lower_bound", ErrIsNotValidNumber) + } else if marginRatio, err := num.DecimalFromString(*cmd.ConcentratedLiquidityParameters.MarginRatioAtLowerBound); err != nil { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.margin_ratio_at_lower_bound", ErrIsNotValidNumber) + } else if marginRatio.LessThan(num.DecimalZero()) { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.margin_ratio_at_lower_bound", ErrMustBePositive) + } + + if len(cmd.SlippageTolerance) <= 0 { + errs.AddForProperty("submit_amm.slippage_tolerance", ErrIsRequired) + } else if slippageTolerance, err := num.DecimalFromString(cmd.SlippageTolerance); err != nil { + errs.AddForProperty("submit_amm.slippage_tolerance", ErrIsNotValidNumber) + } else if slippageTolerance.LessThan(num.DecimalZero()) { + errs.AddForProperty("submit_amm.slippage_tolerance", ErrMustBePositive) + } + + // Base is <= to lower bound == error + if base != nil && lowerBound != nil && base.Cmp(lowerBound) <= 0 { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.base", errors.New("should be a bigger value than lower_bound")) + } + + // base is >= to upper bound == error + if base != nil && upperBound != nil && base.Cmp(upperBound) >= 0 { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.base", errors.New("should be a smaller value than upper_bound")) + } + } + + return errs +} diff --git a/commands/submit_amm_test.go b/commands/submit_amm_test.go new file mode 100644 index 00000000000..7cb511855a1 --- /dev/null +++ b/commands/submit_amm_test.go @@ -0,0 +1,339 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package commands_test + +import ( + "errors" + "testing" + + "code.vegaprotocol.io/vega/commands" + "code.vegaprotocol.io/vega/libs/ptr" + commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" + + "github.com/stretchr/testify/assert" +) + +func TestCheckSubmitAMM(t *testing.T) { + cases := []struct { + submission commandspb.SubmitAMM + errStr string + }{ + { + submission: commandspb.SubmitAMM{}, + errStr: "submit_amm.market_id (is required)", + }, + { + submission: commandspb.SubmitAMM{ + MarketId: "notavalidmarketid", + }, + errStr: "submit_amm.market_id (should be a valid Vega ID)", + }, + { + submission: commandspb.SubmitAMM{ + SlippageTolerance: "", + }, + errStr: "submit_amm.slippage_tolerance (is required)", + }, + { + submission: commandspb.SubmitAMM{ + SlippageTolerance: "abc", + }, + errStr: "submit_amm.slippage_tolerance (is not a valid number)", + }, + { + submission: commandspb.SubmitAMM{ + SlippageTolerance: "-0.5", + }, + errStr: "submit_amm.slippage_tolerance (must be between 0 (excluded) and 1 (included))", + }, + { + submission: commandspb.SubmitAMM{ + SlippageTolerance: "0", + }, + errStr: "submit_amm.slippage_tolerance (must be between 0 (excluded) and 1 (included))", + }, + { + submission: commandspb.SubmitAMM{ + SlippageTolerance: "2", + }, + errStr: "submit_amm.slippage_tolerance (must be between 0 (excluded) and 1 (included))", + }, + { + submission: commandspb.SubmitAMM{ + CommitmentAmount: "", + }, + errStr: "submit_amm.commitment_amount (is required)", + }, + { + submission: commandspb.SubmitAMM{ + CommitmentAmount: "abc", + }, + errStr: "submit_amm.commitment_amount (is not a valid number)", + }, + { + submission: commandspb.SubmitAMM{ + CommitmentAmount: "-10", + }, + errStr: "submit_amm.commitment_amount (must be positive)", + }, + { + submission: commandspb.SubmitAMM{ + CommitmentAmount: "0", + }, + errStr: "submit_amm.commitment_amount (must be positive)", + }, + { + submission: commandspb.SubmitAMM{ + ProposedFee: "", + }, + errStr: "submit_amm.proposed_fee (is required)", + }, + { + submission: commandspb.SubmitAMM{ + ProposedFee: "abc", + }, + errStr: "submit_amm.proposed_fee (is not a valid value)", + }, + { + submission: commandspb.SubmitAMM{ + ProposedFee: "-10", + }, + errStr: "submit_amm.proposed_fee (must be positive)", + }, + { + submission: commandspb.SubmitAMM{ + ProposedFee: "0", + }, + errStr: "submit_amm.proposed_fee (must be positive)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: nil, + }, + errStr: "submit_amm.concentrated_liquidity_parameters (is required)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + Base: "", + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.base (is required)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + Base: "abc", + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.base (is not a valid number)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + Base: "-10", + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.base (must be positive)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + Base: "0", + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.base (must be positive)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + LowerBound: ptr.From(""), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.lower_bound (is not a valid number)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + LowerBound: ptr.From("abc"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.lower_bound (is not a valid number)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + LowerBound: ptr.From("-10"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.lower_bound (must be positive)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + LowerBound: ptr.From("0"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.lower_bound (must be positive)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + UpperBound: ptr.From(""), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.upper_bound (is not a valid number)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + UpperBound: ptr.From("abc"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.upper_bound (is not a valid number)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + UpperBound: ptr.From("-10"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.upper_bound (must be positive)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + UpperBound: ptr.From("0"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.upper_bound (must be positive)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + MarginRatioAtUpperBound: ptr.From(""), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.margin_ratio_at_upper_bound (is not a valid number)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + MarginRatioAtUpperBound: ptr.From("abc"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.margin_ratio_at_upper_bound (is not a valid number)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + MarginRatioAtUpperBound: ptr.From("-10"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.margin_ratio_at_upper_bound (must be positive)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + MarginRatioAtLowerBound: ptr.From(""), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.margin_ratio_at_lower_bound (is not a valid number)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + MarginRatioAtLowerBound: ptr.From("abc"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.margin_ratio_at_lower_bound (is not a valid number)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + MarginRatioAtLowerBound: ptr.From("-10"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.margin_ratio_at_lower_bound (must be positive)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + Base: "1000", + UpperBound: ptr.From("900"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.base (should be a smaller value than upper_bound)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + Base: "1000", + LowerBound: ptr.From("1100"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.base (should be a bigger value than lower_bound)", + }, + { + submission: commandspb.SubmitAMM{ + MarketId: "e9982447fb4128f9968f9981612c5ea85d19b62058ec2636efc812dcbbc745ca", + SlippageTolerance: "0.09", + CommitmentAmount: "10000", + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + Base: "20000", + MarginRatioAtUpperBound: ptr.From("0.1"), + MarginRatioAtLowerBound: ptr.From("0.1"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.lower_bound (lower_bound and upper_bound cannot both be empty)", + }, + { + submission: commandspb.SubmitAMM{ + MarketId: "e9982447fb4128f9968f9981612c5ea85d19b62058ec2636efc812dcbbc745ca", + SlippageTolerance: "0.09", + CommitmentAmount: "10000", + ProposedFee: "0.03", + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + Base: "20000", + UpperBound: ptr.From("30000"), + LowerBound: ptr.From("10000"), + MarginRatioAtUpperBound: ptr.From("0.1"), + MarginRatioAtLowerBound: ptr.From("0.1"), + }, + }, + }, + } + + for n, c := range cases { + if len(c.errStr) <= 0 { + assert.NoError(t, commands.CheckSubmitAMM(&c.submission), n) + continue + } + + assert.Contains(t, checkSubmitAMM(&c.submission).Error(), c.errStr, n) + } +} + +func checkSubmitAMM(cmd *commandspb.SubmitAMM) commands.Errors { + err := commands.CheckSubmitAMM(cmd) + + var e commands.Errors + if ok := errors.As(err, &e); !ok { + return commands.NewErrors() + } + + return e +} diff --git a/commands/transaction.go b/commands/transaction.go index bd401e7b167..500dffcd214 100644 --- a/commands/transaction.go +++ b/commands/transaction.go @@ -258,6 +258,12 @@ func CheckInputData(rawInputData []byte) (*commandspb.InputData, Errors) { errs.Merge(checkJoinTeam(cmd.JoinTeam)) case *commandspb.InputData_UpdatePartyProfile: errs.Merge(checkUpdatePartyProfile(cmd.UpdatePartyProfile)) + case *commandspb.InputData_SubmitAmm: + errs.Merge(checkSubmitAMM(cmd.SubmitAmm)) + case *commandspb.InputData_AmendAmm: + errs.Merge(checkAmendAMM(cmd.AmendAmm)) + case *commandspb.InputData_CancelAmm: + errs.Merge(checkCancelAMM(cmd.CancelAmm)) default: errs.AddForProperty("tx.input_data.command", ErrIsNotSupported) } diff --git a/core/broker/broker_test.go b/core/broker/broker_test.go index b02a8682bc6..8076b9068bf 100644 --- a/core/broker/broker_test.go +++ b/core/broker/broker_test.go @@ -865,7 +865,7 @@ func (c *waiter) Wait() error { func newWaiter() *waiter { ch := make(chan struct{}, 1) ctx, cancelFn := context.WithCancel(context.Background()) - ticker := time.NewTicker(30 * time.Second) + ticker := time.NewTicker(WaiterInterval) go func() { <-ticker.C diff --git a/core/broker/waiter_race_test.go b/core/broker/waiter_race_test.go new file mode 100644 index 00000000000..1173a8f578d --- /dev/null +++ b/core/broker/waiter_race_test.go @@ -0,0 +1,23 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +//go:build race +// +build race + +package broker_test + +import "time" + +const WaiterInterval = 5 * time.Minute diff --git a/core/broker/waiter_test.go b/core/broker/waiter_test.go new file mode 100644 index 00000000000..43929c17feb --- /dev/null +++ b/core/broker/waiter_test.go @@ -0,0 +1,23 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +//go:build !race +// +build !race + +package broker_test + +import "time" + +const WaiterInterval = 30 * time.Second diff --git a/core/collateral/engine.go b/core/collateral/engine.go index 414c8c8152c..940fdc79487 100644 --- a/core/collateral/engine.go +++ b/core/collateral/engine.go @@ -3575,6 +3575,282 @@ func (e *Engine) CreatePartyMarginAccount(ctx context.Context, partyID, marketID return marginID, nil } +// CreatePartyAMMSubAccounts ... +func (e *Engine) CreatePartyAMMsSubAccounts( + ctx context.Context, + party, subAccount, asset, market string, +) (general *types.Account, margin *types.Account, err error) { + generalID, err := e.CreatePartyGeneralAccount(ctx, subAccount, asset) + if err != nil { + return nil, nil, err + } + + marginID, err := e.CreatePartyMarginAccount(ctx, subAccount, market, asset) + if err != nil { + return nil, nil, err + } + + _, err = e.CreatePartyLiquidityFeeAccount(ctx, subAccount, market, asset) + if err != nil { + return nil, nil, err + } + + return e.accs[generalID].Clone(), e.accs[marginID].Clone(), nil +} + +func (e *Engine) getSubAccounts(subAccount, owner, asset, market string) (*types.Account, *types.Account, *types.Account, error) { + ownerGeneral, err := e.GetAccountByID(e.accountID(noMarket, owner, asset, types.AccountTypeGeneral)) + if err != nil { + e.log.Error( + "Failed to get the party general account", + logging.String("owner-id", owner), + logging.String("market-id", market), + logging.Error(err), + ) + return nil, nil, nil, err + } + + // we'll need this account for all transfer types anyway (settlements, margin-risk updates) + subAccountGeneral, err := e.GetAccountByID(e.accountID(noMarket, subAccount, asset, types.AccountTypeGeneral)) + if err != nil { + e.log.Error( + "Failed to get the party sub account", + logging.String("owner-id", owner), + logging.String("market-id", market), + logging.Error(err), + ) + return nil, nil, nil, err + } + + // we'll need this account for all transfer types anyway (settlements, margin-risk updates) + subAccountMargin, err := e.GetAccountByID(e.accountID(market, subAccount, asset, types.AccountTypeMargin)) + if err != nil { + e.log.Error( + "Failed to get the party margin sub account", + logging.String("owner-id", owner), + logging.String("market-id", market), + logging.Error(err), + ) + return nil, nil, nil, err + } + + return ownerGeneral, subAccountGeneral, subAccountMargin, nil +} + +func (e *Engine) getSubAccountTransferRequest( + party, subAccount, asset, market string, + amount *num.Uint, + typ types.TransferType, +) (*types.TransferRequest, error) { + ownerGeneral, subAccountGeneral, subAccountMargin, err := e.getSubAccounts(subAccount, party, asset, market) + if err != nil { + return nil, err + } + + treq := &types.TransferRequest{ + Amount: amount.Clone(), + MinAmount: amount.Clone(), + Asset: asset, + Type: typ, + } + + switch typ { + case types.TransferTypeAMMSubAccountLow: + // do we have enough in the general account to make the transfer? + if !amount.IsZero() && ownerGeneral.Balance.LT(amount) { + return nil, errors.New("not enough collateral in general account") + } + treq.FromAccount = []*types.Account{ownerGeneral} + treq.ToAccount = []*types.Account{subAccountGeneral} + return treq, nil + case types.TransferTypeAMMSubAccountHigh: + treq.FromAccount = []*types.Account{subAccountGeneral, subAccountMargin} + treq.ToAccount = []*types.Account{ownerGeneral} + return treq, nil + default: + return nil, errors.New("unsupported transfer type for sub accounts") + } +} + +func (e *Engine) SubAccountUpdate( + ctx context.Context, + party, subAccount, asset, market string, + transferType types.TransferType, + amount *num.Uint, +) (*types.LedgerMovement, error) { + req, err := e.getSubAccountTransferRequest(party, subAccount, asset, market, amount, transferType) + if err != nil { + return nil, err + } + + res, err := e.getLedgerEntries(ctx, req) + if err != nil { + return nil, err + } + + for _, v := range res.Entries { + // increment the to account + if err := e.IncrementBalance(ctx, e.ADtoID(v.ToAccount), v.Amount); err != nil { + e.log.Error( + "Failed to increment balance for account", + logging.String("asset", v.ToAccount.AssetID), + logging.String("market", v.ToAccount.MarketID), + logging.String("owner", v.ToAccount.Owner), + logging.String("type", v.ToAccount.Type.String()), + logging.BigUint("amount", v.Amount), + logging.Error(err), + ) + } + } + + return res, nil +} + +func (e *Engine) SubAccountClosed(ctx context.Context, party, subAccount, asset, market string) ([]*types.LedgerMovement, error) { + lMovements := make([]*types.LedgerMovement, 0, 2) + // NOTE: use subAccount as party ID here to release the margin sub-account to the general sub-account + mlm, err := e.ClearPartyMarginAccount(ctx, subAccount, market, asset) + if err != nil { + return nil, err + } + if mlm != nil { + lMovements = append(lMovements, mlm) + } + ownerGeneral, subAccountGeneral, _, err := e.getSubAccounts(subAccount, party, asset, market) + if err != nil { + return nil, err + } + // one transfer from general to general + treq := &types.TransferRequest{ + Amount: subAccountGeneral.Balance.Clone(), + MinAmount: subAccountGeneral.Balance.Clone(), + Asset: asset, + Type: types.TransferTypeAMMSubAccountRelease, + FromAccount: []*types.Account{subAccountGeneral}, + ToAccount: []*types.Account{ownerGeneral}, + } + + gres, err := e.getLedgerEntries(ctx, treq) + if err != nil { + return nil, err + } + + for _, v := range gres.Entries { + // increment the to account + if err := e.IncrementBalance(ctx, e.ADtoID(v.ToAccount), v.Amount); err != nil { + e.log.Error( + "Failed to increment balance for account", + logging.String("asset", v.ToAccount.AssetID), + logging.String("market", v.ToAccount.MarketID), + logging.String("owner", v.ToAccount.Owner), + logging.String("type", v.ToAccount.Type.String()), + logging.BigUint("amount", v.Amount), + logging.Error(err), + ) + return nil, err + } + } + lMovements = append(lMovements, gres) + // return ledger movements + return lMovements, nil +} + +func (e *Engine) SubAccountRelease( + ctx context.Context, + party, subAccount, asset, market string, + pos events.MarketPosition, +) ([]*types.LedgerMovement, events.Margin, error) { + ownerGeneral, subAccountGeneral, subAccountMargin, err := e.getSubAccounts(subAccount, party, asset, market) + if err != nil { + return nil, nil, err + } + + // subaccount has a position so construct a margin-update thing which we can pass to + // the market to closeout its position. + var closeout events.Margin + if pos.Size() != 0 { + closeout = &marginUpdate{ + MarketPosition: pos, + asset: asset, + marketID: market, + marginShortFall: num.UintZero(), + } + } + // one transfer from general to general + treq := &types.TransferRequest{ + Amount: subAccountGeneral.Balance.Clone(), + MinAmount: subAccountGeneral.Balance.Clone(), + Asset: asset, + Type: types.TransferTypeAMMSubAccountRelease, + FromAccount: []*types.Account{subAccountGeneral}, + ToAccount: []*types.Account{ownerGeneral}, + } + + gres, err := e.getLedgerEntries(ctx, treq) + if err != nil { + return nil, nil, err + } + + for _, v := range gres.Entries { + // increment the to account + if err := e.IncrementBalance(ctx, e.ADtoID(v.ToAccount), v.Amount); err != nil { + e.log.Error( + "Failed to increment balance for account", + logging.String("asset", v.ToAccount.AssetID), + logging.String("market", v.ToAccount.MarketID), + logging.String("owner", v.ToAccount.Owner), + logging.String("type", v.ToAccount.Type.String()), + logging.BigUint("amount", v.Amount), + logging.Error(err), + ) + return nil, nil, err + } + } + + // if there's no margin balance to release, we're done + if subAccountMargin.Balance.IsZero() { + return []*types.LedgerMovement{gres}, closeout, nil + } + + // non-zero balance -> confiscate + // one transfer from margin to market insurance + mktInsurance, err := e.GetMarketInsurancePoolAccount(market, asset) + if err != nil { + return nil, nil, err + } + + treq = &types.TransferRequest{ + Amount: subAccountMargin.Balance.Clone(), + MinAmount: subAccountMargin.Balance.Clone(), + Asset: asset, + Type: types.TransferTypeAMMSubAccountRelease, + FromAccount: []*types.Account{subAccountMargin}, + ToAccount: []*types.Account{mktInsurance}, + } + + mres, err := e.getLedgerEntries(ctx, treq) + if err != nil { + return nil, nil, err + } + + for _, v := range mres.Entries { + // increment the to account + if err := e.IncrementBalance(ctx, e.ADtoID(v.ToAccount), v.Amount); err != nil { + e.log.Error( + "Failed to increment balance for account", + logging.String("asset", v.ToAccount.AssetID), + logging.String("market", v.ToAccount.MarketID), + logging.String("owner", v.ToAccount.Owner), + logging.String("type", v.ToAccount.Type.String()), + logging.BigUint("amount", v.Amount), + logging.Error(err), + ) + } + } + + return []*types.LedgerMovement{gres, mres}, closeout, nil +} + // GetPartyMarginAccount returns a margin account given the partyID and market. func (e *Engine) GetPartyMarginAccount(market, party, asset string) (*types.Account, error) { margin := e.accountID(market, party, asset, types.AccountTypeMargin) diff --git a/core/events/amm_pool.go b/core/events/amm_pool.go new file mode 100644 index 00000000000..c915e270ee4 --- /dev/null +++ b/core/events/amm_pool.go @@ -0,0 +1,91 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package events + +import ( + "context" + + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/libs/num" + eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" +) + +type AMMPool struct { + *Base + pool *eventspb.AMMPool +} + +func NewAMMPoolEvent( + ctx context.Context, + party, market, subAccount, poolID string, + commitment *num.Uint, + p *types.ConcentratedLiquidityParameters, + status types.AMMPoolStatus, + statusReason types.AMMPoolStatusReason, +) *AMMPool { + order := &AMMPool{ + Base: newBase(ctx, AMMPoolEvent), + pool: &eventspb.AMMPool{ + PartyId: party, + MarketId: market, + PoolId: poolID, + SubAccount: subAccount, + Commitment: commitment.String(), + Parameters: p.ToProtoEvent(), + Status: status, + StatusReason: statusReason, + }, + } + // set to original order price + return order +} + +func (p AMMPool) IsParty(id string) bool { + return p.pool.PartyId == id +} + +func (p AMMPool) PartyID() string { + return p.pool.PartyId +} + +func (p AMMPool) MarketID() string { + return p.pool.MarketId +} + +func (p *AMMPool) AMMPool() *eventspb.AMMPool { + return p.pool +} + +func (p AMMPool) Proto() eventspb.AMMPool { + return *p.pool +} + +func (p AMMPool) StreamMessage() *eventspb.BusEvent { + busEvent := newBusEventFromBase(p.Base) + busEvent.Event = &eventspb.BusEvent_AmmPool{ + AmmPool: p.pool, + } + + return busEvent +} + +func AMMPoolEventFromStream(ctx context.Context, be *eventspb.BusEvent) *AMMPool { + pool := &AMMPool{ + Base: newBaseFromBusEvent(ctx, AMMPoolEvent, be), + pool: be.GetAmmPool(), + } + return pool +} diff --git a/core/events/bus.go b/core/events/bus.go index e127cacea4d..f63c637ff71 100644 --- a/core/events/bus.go +++ b/core/events/bus.go @@ -172,6 +172,7 @@ const ( TeamsStatsUpdatedEvent TimeWeightedNotionalPositionUpdatedEvent CancelledOrdersEvent + AMMPoolEvent ) var ( @@ -273,6 +274,7 @@ var ( eventspb.BusEventType_BUS_EVENT_TYPE_TEAMS_STATS_UPDATED: TeamsStatsUpdatedEvent, eventspb.BusEventType_BUS_EVENT_TYPE_TIME_WEIGHTED_NOTIONAL_POSITION_UPDATED: TimeWeightedNotionalPositionUpdatedEvent, eventspb.BusEventType_BUS_EVENT_TYPE_CANCELLED_ORDERS: CancelledOrdersEvent, + eventspb.BusEventType_BUS_EVENT_TYPE_AMM_POOL: AMMPoolEvent, // If adding a type here, please also add it to datanode/broker/convert.go } @@ -365,6 +367,7 @@ var ( TeamsStatsUpdatedEvent: eventspb.BusEventType_BUS_EVENT_TYPE_TEAMS_STATS_UPDATED, TimeWeightedNotionalPositionUpdatedEvent: eventspb.BusEventType_BUS_EVENT_TYPE_TIME_WEIGHTED_NOTIONAL_POSITION_UPDATED, CancelledOrdersEvent: eventspb.BusEventType_BUS_EVENT_TYPE_CANCELLED_ORDERS, + AMMPoolEvent: eventspb.BusEventType_BUS_EVENT_TYPE_AMM_POOL, // If adding a type here, please also add it to datanode/broker/convert.go } @@ -456,6 +459,7 @@ var ( TeamsStatsUpdatedEvent: "TeamsStatsUpdatedEvent", TimeWeightedNotionalPositionUpdatedEvent: "TimeWeightedNotionalPositionUpdatedEvent", CancelledOrdersEvent: "CancelledOrdersEvent", + AMMPoolEvent: "AMMPoolEvent", } ) diff --git a/core/events/transaction_result.go b/core/events/transaction_result.go index 7d189369e37..a6541256f5d 100644 --- a/core/events/transaction_result.go +++ b/core/events/transaction_result.go @@ -198,6 +198,18 @@ func (t *TransactionResult) setTx(tx interface{}) *TransactionResult { t.evt.Transaction = &eventspb.TransactionResult_UpdatePartyProfile{ UpdatePartyProfile: tv, } + case *commandspb.SubmitAMM: + t.evt.Transaction = &eventspb.TransactionResult_SubmitAmm{ + SubmitAmm: tv, + } + case *commandspb.AmendAMM: + t.evt.Transaction = &eventspb.TransactionResult_AmendAmm{ + AmendAmm: tv, + } + case *commandspb.CancelAMM: + t.evt.Transaction = &eventspb.TransactionResult_CancelAmm{ + CancelAmm: tv, + } default: panic(fmt.Sprintf("unsupported command %T", tv)) } diff --git a/core/execution/amm/engine.go b/core/execution/amm/engine.go new file mode 100644 index 00000000000..be7406bfe94 --- /dev/null +++ b/core/execution/amm/engine.go @@ -0,0 +1,999 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package amm + +import ( + "context" + "encoding/hex" + "errors" + "fmt" + "sort" + "time" + + "code.vegaprotocol.io/vega/core/events" + "code.vegaprotocol.io/vega/core/execution/common" + "code.vegaprotocol.io/vega/core/idgeneration" + "code.vegaprotocol.io/vega/core/positions" + "code.vegaprotocol.io/vega/core/types" + vgcontext "code.vegaprotocol.io/vega/libs/context" + "code.vegaprotocol.io/vega/libs/crypto" + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/logging" + v1 "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" + + "golang.org/x/exp/maps" +) + +var ( + ErrNoPoolMatchingParty = errors.New("no pool matching party") + ErrPartyAlreadyOwnAPool = func(market string) error { + return fmt.Errorf("party already own a pool for market %v", market) + } + ErrCommitmentTooLow = errors.New("commitment amount too low") + ErrRebaseOrderDidNotTrade = errors.New("rebase-order did not trade") + ErrRebaseTargetOutsideBounds = errors.New("rebase target outside bounds") +) + +const ( + version = "AMMv1" +) + +//go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/core/execution/amm Collateral,Position,Market,Risk + +type Collateral interface { + GetAssetQuantum(asset string) (num.Decimal, error) + GetPartyMarginAccount(market, party, asset string) (*types.Account, error) + GetPartyGeneralAccount(party, asset string) (*types.Account, error) + SubAccountUpdate( + ctx context.Context, + party, subAccount, asset, market string, + transferType types.TransferType, + amount *num.Uint, + ) (*types.LedgerMovement, error) + SubAccountClosed(ctx context.Context, party, subAccount, asset, market string) ([]*types.LedgerMovement, error) + SubAccountRelease( + ctx context.Context, + party, subAccount, asset, market string, mevt events.MarketPosition, + ) ([]*types.LedgerMovement, events.Margin, error) + CreatePartyAMMsSubAccounts( + ctx context.Context, + party, subAccount, asset, market string, + ) (general *types.Account, margin *types.Account, err error) +} + +type Broker interface { + Send(events.Event) +} + +type Market interface { + GetID() string + ClosePosition(context.Context, string) bool // return true if position was successfully closed + GetSettlementAsset() string + SubmitOrderWithIDGeneratorAndOrderID(context.Context, *types.OrderSubmission, string, common.IDGenerator, string, bool) (*types.OrderConfirmation, error) +} + +type Risk interface { + GetRiskFactors() *types.RiskFactor + GetScalingFactors() *types.ScalingFactors + GetSlippage() num.Decimal +} + +type Position interface { + GetPositionsByParty(ids ...string) []events.MarketPosition +} + +type sqrtFn func(*num.Uint) num.Decimal + +// Sqrter calculates sqrt's of Uints and caches the results. We want this cache to be shared across all pools for a market. +type Sqrter struct { + cache map[string]num.Decimal +} + +// sqrt calculates the square root of the uint and caches it. +func (s *Sqrter) sqrt(u *num.Uint) num.Decimal { + if r, ok := s.cache[u.String()]; ok { + return r + } + + // TODO that we may need to re-visit this depending on the performance impact + // but for now lets do it "properly" in full decimals and work out how we can + // improve it once we have reg-tests and performance data. + + // integer sqrt is a good approximation + r := num.UintOne().Sqrt(u).ToDecimal() + + // so now lets do a few iterations using Heron's Method to get closer + // x_i = (x + u/x) / 2 + ud := u.ToDecimal() + for i := 0; i < 6; i++ { + r = r.Add(ud.Div(r)).Div(num.DecimalFromInt64(2)) + } + + // and cache it -- we can also maybe be more clever here and use a LRU but thats for later + s.cache[u.String()] = r + return r +} + +type Engine struct { + log *logging.Logger + + broker Broker + // TODO karel - use interface for market activity tracker + marketActivityTracker *common.MarketActivityTracker + + risk Risk + collateral Collateral + position Position + market Market + idgen *idgeneration.IDGenerator + + // gets us from the price in the submission -> price in full asset dp + priceFactor num.Decimal + positionFactor num.Decimal + + // map of party -> pool + pools map[string]*Pool + poolsCpy []*Pool + + // sqrt calculator with cache + rooter *Sqrter + + // a mapping of all sub accounts to the party owning them. + subAccounts map[string]string + + minCommitmentQuantum *num.Uint +} + +func New( + log *logging.Logger, + broker Broker, + collateral Collateral, + market Market, + risk Risk, + position Position, + priceFactor num.Decimal, + positionFactor num.Decimal, + marketActivityTracker *common.MarketActivityTracker, +) *Engine { + return &Engine{ + log: log, + broker: broker, + risk: risk, + collateral: collateral, + position: position, + market: market, + marketActivityTracker: marketActivityTracker, + pools: map[string]*Pool{}, + poolsCpy: []*Pool{}, + subAccounts: map[string]string{}, + minCommitmentQuantum: num.UintZero(), + rooter: &Sqrter{cache: map[string]num.Decimal{}}, + priceFactor: priceFactor, + positionFactor: positionFactor, + } +} + +func NewFromProto( + log *logging.Logger, + broker Broker, + collateral Collateral, + market Market, + risk Risk, + position Position, + state *v1.AmmState, + priceFactor num.Decimal, + positionFactor num.Decimal, + marketActivityTracker *common.MarketActivityTracker, +) *Engine { + e := New(log, broker, collateral, market, risk, position, priceFactor, positionFactor, marketActivityTracker) + + for _, v := range state.SubAccounts { + e.subAccounts[v.Key] = v.Value + } + + // TODO consider whether we want the cache in the snapshot, it might be pretty large/slow and I'm not sure what we gain + for _, v := range state.Sqrter { + e.rooter.cache[v.Key] = num.MustDecimalFromString(v.Value) + } + + for _, v := range state.Pools { + e.add(NewPoolFromProto(e.rooter.sqrt, e.collateral, e.position, v.Pool, v.Party, priceFactor)) + } + + return e +} + +func (e *Engine) IntoProto() *v1.AmmState { + state := &v1.AmmState{ + Sqrter: make([]*v1.StringMapEntry, 0, len(e.rooter.cache)), + SubAccounts: make([]*v1.StringMapEntry, 0, len(e.subAccounts)), + Pools: make([]*v1.PoolMapEntry, 0, len(e.pools)), + } + + for k, v := range e.rooter.cache { + state.Sqrter = append(state.Sqrter, &v1.StringMapEntry{ + Key: k, + Value: v.String(), + }) + } + sort.Slice(state.Sqrter, func(i, j int) bool { return state.Sqrter[i].Key < state.Sqrter[j].Key }) + + for k, v := range e.subAccounts { + state.SubAccounts = append(state.SubAccounts, &v1.StringMapEntry{ + Key: k, + Value: v, + }) + } + sort.Slice(state.SubAccounts, func(i, j int) bool { return state.SubAccounts[i].Key < state.SubAccounts[j].Key }) + + for _, v := range e.poolsCpy { + state.Pools = append(state.Pools, &v1.PoolMapEntry{ + Party: v.party, + Pool: v.IntoProto(), + }) + } + return state +} + +func (e *Engine) OnMinCommitmentQuantumUpdate(ctx context.Context, c *num.Uint) { + e.minCommitmentQuantum = c.Clone() +} + +// OnMTM is called whenever core does an MTM and is a signal that any pool's that are closing and have 0 position can be fully removed. +func (e *Engine) OnMTM(ctx context.Context) { + for _, p := range e.poolsCpy { + if !p.closing() { + continue + } + if pos, _ := p.getPosition(); pos != 0 { + continue + } + + // pool is closing and has reached 0 position, we can cancel it now + if _, err := e.releaseSubAccounts(ctx, p, false); err != nil { + e.log.Error("unable to release subaccount balance", logging.Error(err)) + } + p.status = types.AMMPoolStatusCancelled + e.remove(ctx, p.party) + } +} + +func (e *Engine) OnTick(ctx context.Context, _ time.Time) { + // seed an id-generator to create IDs for any orders generated in this block + _, blockHash := vgcontext.TraceIDFromContext(ctx) + e.idgen = idgeneration.New(blockHash + crypto.HashStrToHex("amm-engine"+e.market.GetID())) + + // any pools that for some reason have zero balance in their accounts will get stopped + for _, p := range e.poolsCpy { + if p.getBalance().IsZero() { + p.status = types.AMMPoolStatusStopped + e.remove(ctx, p.party) + continue + } + } +} + +// RemoveDistressed checks if any of the closed out parties are AMM's and if so the AMM is stopped and removed. +func (e *Engine) RemoveDistressed(ctx context.Context, closed []events.MarketPosition) { + for _, c := range closed { + owner, ok := e.subAccounts[c.Party()] + if !ok { + continue + } + p, ok := e.pools[owner] + if !ok { + e.log.Panic("could not find pool for subaccount, not possible", + logging.String("subaccount", c.Party()), + logging.String("owner", owner), + ) + } + p.status = types.AMMPoolStatusStopped + e.remove(ctx, owner) + } +} + +func (e *Engine) IsPoolSubAccount(key string) bool { + _, yes := e.subAccounts[key] + return yes +} + +// BestPricesAndVolumes returns the best bid/ask and their volumes across all the registered AMM's. +func (e *Engine) BestPricesAndVolumes() (*num.Uint, uint64, *num.Uint, uint64) { + var bestBid, bestAsk *num.Uint + var bestBidVolume, bestAskVolume uint64 + + for _, pool := range e.poolsCpy { + // get the pool's current price + fp := pool.BestPrice(nil) + + // get the volume on the buy side by simulating an incoming sell order + bid := num.UintZero().Sub(fp, pool.oneTick) + volume := pool.TradableVolumeInRange(types.SideSell, fp.Clone(), bid) + if bestBid == nil || bid.GT(bestBid) { + bestBid = bid + bestBidVolume = volume + } else if bid.EQ(bestBid) { + bestBidVolume += volume + } + + // get the volume on the sell side by simulating an incoming buy order + ask := num.UintZero().Add(fp, pool.oneTick) + volume = pool.TradableVolumeInRange(types.SideBuy, fp.Clone(), ask) + if bestAsk == nil || ask.LT(bestAsk) { + bestAsk = ask + bestAskVolume = volume + } else if ask.EQ(bestAsk) { + bestAskVolume += volume + } + } + return bestBid, bestBidVolume, bestAsk, bestAskVolume +} + +func (e *Engine) submit(active []*Pool, agg *types.Order, inner, outer *num.Uint) []*types.Order { + if e.log.GetLevel() == logging.DebugLevel { + e.log.Debug("checking for volume between", + logging.String("inner", inner.String()), + logging.String("outer", outer.String()), + ) + } + + orders := []*types.Order{} + useActive := make([]*Pool, 0, len(active)) + for _, p := range active { + p.setEphemeralPosition() + + price := p.BestPrice(agg) + if e.log.GetLevel() == logging.DebugLevel { + e.log.Debug("best price for pool", + logging.String("id", p.ID), + logging.String("best-price", price.String()), + ) + } + + if agg.Side == types.SideBuy { + if price.GTE(outer) || (agg.Type != types.OrderTypeMarket && price.GT(agg.Price)) { + // either fair price is out of bounds, or is selling at higher than incoming buy + continue + } + } + + if agg.Side == types.SideSell { + if price.LTE(outer) || (agg.Type != types.OrderTypeMarket && price.LT(agg.Price)) { + // either fair price is out of bounds, or is buying at lower than incoming sell + continue + } + } + useActive = append(useActive, p) + } + + if agg.Side == types.SideSell { + inner, outer = outer, inner + } + + // calculate the volume each pool has + var total uint64 + volumes := []uint64{} + for _, p := range useActive { + volume := p.TradableVolumeInRange(agg.Side, inner, outer) + if e.log.GetLevel() == logging.DebugLevel { + e.log.Debug("volume available to trade", + logging.Uint64("volume", volume), + logging.String("id", p.ID), + ) + } + + volumes = append(volumes, volume) + total += volume + } + + // if the pools consume the whole incoming order's volume, share it out pro-rata + if agg.Remaining < total { + var retotal uint64 + for i := range volumes { + volumes[i] = agg.Remaining * volumes[i] / total + retotal += volumes[i] + } + + // any lost crumbs due to integer division is given to the first pool + if d := agg.Remaining - retotal; d != 0 { + volumes[0] += d + } + } + + // now generate offbook orders + for i, p := range useActive { + volume := volumes[i] + if volume == 0 { + continue + } + + pos, ae := p.getPosition() + x, y := p.virtualBalances(pos, ae, agg.Side) + dx := num.DecimalFromInt64(int64(volume)) + + // dy = x*y / (x - dx) - y + // where y and x are the balances on either side of the pool, and dx is the change in volume + // then the trade price is dy/dx + dy := x.Mul(y).Div(x.Sub(dx)).Sub(y) + price, _ := num.UintFromDecimal(dy.Div(dx)) + if e.log.GetLevel() == logging.DebugLevel { + e.log.Debug("generated order at price", + logging.String("price", price.String()), + logging.Uint64("volume", volume), + logging.String("id", p.ID), + logging.Int64("pos", pos), + logging.String("average-entry", ae.String()), + logging.String("y", y.String()), + logging.String("x", x.String()), + logging.String("dy", dy.String()), + logging.String("dx", dx.String()), + ) + } + + // construct the orders + o := &types.Order{ + ID: e.idgen.NextID(), + MarketID: p.market, + Party: p.SubAccount, + Size: volume, + Remaining: volume, + Price: price, + Side: types.OtherSide(agg.Side), + TimeInForce: types.OrderTimeInForceFOK, + Type: types.OrderTypeMarket, + CreatedAt: agg.CreatedAt, + Status: types.OrderStatusFilled, + Reference: "vamm-" + p.SubAccount, + GeneratedOffbook: true, + } + o.OriginalPrice, _ = num.UintFromDecimal(o.Price.ToDecimal().Div(e.priceFactor)) + + orders = append(orders, o) + p.updateEphemeralPosition(o) + + agg.Remaining -= volume + } + + return orders +} + +// partition takes the given price range and returns which pools have volume in that region, and +// divides that range into sub-levels where AMM boundaries end. +func (e *Engine) partition(agg *types.Order, inner, outer *num.Uint) ([]*Pool, []*num.Uint) { + active := []*Pool{} + bounds := map[string]*num.Uint{} + + // cap outer to incoming order price + if agg.Type != types.OrderTypeMarket { + switch { + case outer == nil: + outer = agg.Price.Clone() + case agg.Side == types.SideSell && agg.Price.GT(outer): + outer = agg.Price.Clone() + case agg.Side == types.SideBuy && agg.Price.LT(outer): + outer = agg.Price.Clone() + } + } + + // switch so that inner < outer to make it easier to reason with + if agg.Side == types.SideSell { + inner, outer = outer, inner + } + + if inner != nil { + bounds[inner.String()] = inner.Clone() + } + if outer != nil { + bounds[outer.String()] = outer.Clone() + } + + for _, p := range e.poolsCpy { + // not active in range if it cannot trade + if !p.canTrade(agg.Side) { + continue + } + + // not active in range if its the pool's curves are wholly outside of [inner, outer] + if (inner != nil && p.upper.high.LT(inner)) || (outer != nil && p.lower.low.GT(outer)) { + continue + } + + // pool is active in range add it to the slice + active = append(active, p) + + // if a pool's upper or lower boundary exists within (inner, outer) then we consider that a sub-level + boundary := p.upper.high + if outer == nil || boundary.LT(outer) { + bounds[boundary.String()] = boundary.Clone() + } + + boundary = p.lower.low + if inner == nil || boundary.GT(inner) { + bounds[boundary.String()] = boundary.Clone() + } + } + + // now sort the sub-levels, if the incoming order is a buy we want them ordered ascending so we consider prices in this order: + // 2000 -> 2100 -> 2200 + // + // and if its a sell we want them descending so we consider them like: + // 2000 -> 1900 -> 1800 + levels := maps.Values(bounds) + sort.Slice(levels, + func(i, j int) bool { + if agg.Side == types.SideSell { + return levels[i].GT(levels[j]) + } + return levels[i].LT(levels[j]) + }, + ) + return active, levels +} + +// SubmitOrder takes an aggressive order and generates matching orders with the registered AMMs such that +// volume is only taken in the interval (inner, outer) where inner and outer are price-levels on the orderbook. +// For example if agg is a buy order inner < outer, and if its a sell outer < inner. +func (e *Engine) SubmitOrder(agg *types.Order, inner, outer *num.Uint) []*types.Order { + if len(e.pools) == 0 { + return nil + } + + if e.log.GetLevel() == logging.DebugLevel { + e.log.Debug("looking for match with order", + logging.Int("n-pools", len(e.pools)), + logging.Order(agg), + ) + } + + // parition the given range into levels where AMM boundaries end + agg = agg.Clone() + active, levels := e.partition(agg, inner, outer) + + // submit orders to active pool's between each price level created by any of their high/low boundaries + orders := []*types.Order{} + for i := 0; i < len(levels)-1; i++ { + o := e.submit(active, agg, levels[i], levels[i+1]) + orders = append(orders, o...) + + if agg.Remaining == 0 { + break + } + } + + return orders +} + +// NotifyFinished is called when the matching engine has finished matching an order and is returning it to +// the market for processing. +func (e *Engine) NotifyFinished() { + for _, p := range e.poolsCpy { + p.clearEphemeralPosition() + } +} + +func (e *Engine) SubmitAMM( + ctx context.Context, + submit *types.SubmitAMM, + deterministicID string, + targetPrice *num.Uint, +) error { + idgen := idgeneration.New(deterministicID) + poolID := idgen.NextID() + + subAccount := DeriveSubAccount(submit.Party, submit.MarketID, version, 0) + _, ok := e.pools[submit.Party] + if ok { + e.broker.Send( + events.NewAMMPoolEvent( + ctx, submit.Party, e.market.GetID(), subAccount, poolID, + submit.CommitmentAmount, submit.Parameters, + types.AMMPoolStatusRejected, types.AMMPoolStatusReasonPartyAlreadyOwnsAPool, + ), + ) + + return ErrPartyAlreadyOwnAPool(e.market.GetID()) + } + + if err := e.ensureCommitmentAmount(ctx, submit.CommitmentAmount); err != nil { + e.broker.Send( + events.NewAMMPoolEvent( + ctx, submit.Party, e.market.GetID(), subAccount, poolID, + submit.CommitmentAmount, submit.Parameters, + types.AMMPoolStatusRejected, types.AMMPoolStatusReasonCommitmentTooLow, + ), + ) + return err + } + + _, _, err := e.collateral.CreatePartyAMMsSubAccounts(ctx, submit.Party, subAccount, e.market.GetSettlementAsset(), submit.MarketID) + if err != nil { + e.broker.Send( + events.NewAMMPoolEvent( + ctx, submit.Party, e.market.GetID(), subAccount, poolID, + submit.CommitmentAmount, submit.Parameters, + types.AMMPoolStatusRejected, types.AMMPoolStatusReasonUnspecified, + ), + ) + + return err + } + + err = e.updateSubAccountBalance( + ctx, submit.Party, subAccount, submit.CommitmentAmount, + ) + if err != nil { + e.broker.Send( + events.NewAMMPoolEvent( + ctx, submit.Party, e.market.GetID(), subAccount, poolID, + submit.CommitmentAmount, submit.Parameters, + types.AMMPoolStatusRejected, types.AMMPoolStatusReasonCannotFillCommitment, + ), + ) + + return err + } + pool := NewPool( + poolID, + subAccount, + e.market.GetSettlementAsset(), + submit, + e.rooter.sqrt, + e.collateral, + e.position, + e.risk.GetRiskFactors(), + e.risk.GetScalingFactors(), + e.risk.GetSlippage(), + e.priceFactor, + e.positionFactor, + ) + + if targetPrice != nil { + if err := e.rebasePool(ctx, pool, targetPrice, submit.SlippageTolerance, idgen); err != nil { + if err := e.updateSubAccountBalance(ctx, submit.Party, subAccount, num.UintZero()); err != nil { + e.log.Panic("unable to remove sub account balances", logging.Error(err)) + } + + // couldn't rebase the pool so it gets rejected + e.broker.Send( + events.NewAMMPoolEvent( + ctx, submit.Party, e.market.GetID(), subAccount, poolID, + submit.CommitmentAmount, submit.Parameters, + types.AMMPoolStatusRejected, types.AMMPoolStatusReasonCannotRebase, + ), + ) + return err + } + } + e.log.Debug("AMM added for market", + logging.String("owner", submit.Party), + logging.String("marketID", e.market.GetID()), + logging.String("poolID", pool.ID), + ) + e.add(pool) + e.sendUpdate(ctx, pool) + return nil +} + +func (e *Engine) AmendAMM( + ctx context.Context, + amend *types.AmendAMM, + deterministicID string, +) error { + pool, ok := e.pools[amend.Party] + if !ok { + return ErrNoPoolMatchingParty + } + + if amend.CommitmentAmount != nil { + if err := e.ensureCommitmentAmount(ctx, amend.CommitmentAmount); err != nil { + return err + } + + if err := e.updateSubAccountBalance(ctx, amend.Party, pool.SubAccount, amend.CommitmentAmount); err != nil { + return err + } + } + + oldCommitment := pool.Commitment.Clone() + fairPrice := pool.BestPrice(nil) + oldParams := pool.Update(amend, e.risk.GetRiskFactors(), e.risk.GetScalingFactors(), e.risk.GetSlippage()) + if err := e.rebasePool(ctx, pool, fairPrice, amend.SlippageTolerance, idgeneration.New(deterministicID)); err != nil { + // couldn't rebase the pool back to its original fair price so the amend is rejected + if err := e.updateSubAccountBalance(ctx, amend.Party, pool.SubAccount, oldCommitment); err != nil { + e.log.Panic("could not revert balances are failed rebase", logging.Error(err)) + } + // restore updated parameters + pool.Parameters = oldParams + // restore curves + pool.setCurves(e.risk.GetRiskFactors(), e.risk.GetScalingFactors(), e.risk.GetSlippage()) + + return err + } + + // set state to active since if it was closing in reduce-position mode it becomes alive again + pool.status = types.AMMPoolStatusActive + e.sendUpdate(ctx, pool) + return nil +} + +func (e *Engine) CancelAMM( + ctx context.Context, + cancel *types.CancelAMM, +) (events.Margin, error) { + pool, ok := e.pools[cancel.Party] + if !ok { + return nil, ErrNoPoolMatchingParty + } + + if cancel.Method == types.AMMPoolCancellationMethodReduceOnly { + // pool will now only accept trades that will reduce its position + pool.status = types.AMMPoolStatusReduceOnly + e.sendUpdate(ctx, pool) + return nil, nil + } + + // either pool has no position or owner wants out right now, so release general balance and + // get ready for a closeout. + closeout, err := e.releaseSubAccounts(ctx, pool, false) + if err != nil { + return nil, err + } + + pool.status = types.AMMPoolStatusCancelled + e.remove(ctx, cancel.Party) + return closeout, nil +} + +func (e *Engine) StopPool( + ctx context.Context, + key string, +) error { + party, ok := e.subAccounts[key] + if !ok { + return ErrNoPoolMatchingParty + } + e.remove(ctx, party) + return nil +} + +// MarketClosing stops all AMM's and returns subaccount balances back to the owning party. +func (e *Engine) MarketClosing(ctx context.Context) error { + for _, p := range e.poolsCpy { + if _, err := e.releaseSubAccounts(ctx, p, true); err != nil { + return err + } + p.status = types.AMMPoolStatusStopped + e.remove(ctx, p.party) + } + return nil +} + +func (e *Engine) sendUpdate(ctx context.Context, pool *Pool) { + e.broker.Send( + events.NewAMMPoolEvent( + ctx, pool.party, e.market.GetID(), pool.SubAccount, pool.ID, + pool.Commitment, pool.Parameters, + pool.status, types.AMMPoolStatusReasonUnspecified, + ), + ) +} + +func (e *Engine) ensureCommitmentAmount( + _ context.Context, + commitmentAmount *num.Uint, +) error { + quantum, _ := e.collateral.GetAssetQuantum(e.market.GetSettlementAsset()) + quantumCommitment := commitmentAmount.ToDecimal().Div(quantum) + + if quantumCommitment.LessThan(e.minCommitmentQuantum.ToDecimal()) { + return ErrCommitmentTooLow + } + + return nil +} + +// releaseSubAccountGeneralBalance returns the full balance of the sub-accounts general account back to the +// owner of the pool. +func (e *Engine) releaseSubAccounts(ctx context.Context, pool *Pool, mktClose bool) (events.Margin, error) { + if mktClose { + ledgerMovements, err := e.collateral.SubAccountClosed(ctx, pool.party, pool.SubAccount, pool.asset, pool.market) + if err != nil { + return nil, err + } + e.broker.Send(events.NewLedgerMovements(ctx, ledgerMovements)) + return nil, nil + } + var pos events.MarketPosition + if pp := e.position.GetPositionsByParty(pool.SubAccount); len(pp) > 0 { + pos = pp[0] + } else { + // if a pool is cancelled right after creation it won't have a position yet so we just make an empty one to give + // to collateral + pos = positions.NewMarketPosition(pool.SubAccount) + } + + ledgerMovements, closeout, err := e.collateral.SubAccountRelease(ctx, pool.party, pool.SubAccount, pool.asset, pool.market, pos) + if err != nil { + return nil, err + } + + e.broker.Send(events.NewLedgerMovements( + ctx, ledgerMovements)) + return closeout, nil +} + +func (e *Engine) updateSubAccountBalance( + ctx context.Context, + party, subAccount string, + newCommitment *num.Uint, +) error { + // first we get the current balance of both the margin, and general subAccount + subMargin, err := e.collateral.GetPartyMarginAccount( + e.market.GetID(), subAccount, e.market.GetSettlementAsset()) + if err != nil { + // by that point the account must exist + e.log.Panic("no sub margin account", logging.Error(err)) + } + subGeneral, err := e.collateral.GetPartyGeneralAccount( + subAccount, e.market.GetSettlementAsset()) + if err != nil { + // by that point the account must exist + e.log.Panic("no sub general account", logging.Error(err)) + } + + var ( + currentCommitment = num.Sum(subMargin.Balance, subGeneral.Balance) + transferType types.TransferType + actualAmount = num.UintZero() + ) + + if currentCommitment.LT(newCommitment) { + transferType = types.TransferTypeAMMSubAccountLow + actualAmount.Sub(newCommitment, currentCommitment) + } else if currentCommitment.GT(newCommitment) { + transferType = types.TransferTypeAMMSubAccountHigh + actualAmount.Sub(currentCommitment, newCommitment) + } else { + // nothing to do + return nil + } + + ledgerMovements, err := e.collateral.SubAccountUpdate( + ctx, party, subAccount, e.market.GetSettlementAsset(), + e.market.GetID(), transferType, actualAmount, + ) + if err != nil { + return err + } + + e.broker.Send(events.NewLedgerMovements( + ctx, []*types.LedgerMovement{ledgerMovements})) + + return nil +} + +// rebasePool submits an order on behalf of the given pool to pull it fair-price towards the target. +func (e *Engine) rebasePool(ctx context.Context, pool *Pool, target *num.Uint, tol num.Decimal, idgen common.IDGenerator) error { + if target.LT(pool.lower.low) || target.GT(pool.upper.high) { + return ErrRebaseTargetOutsideBounds + } + + // get the pools current fair-price + fairPrice := pool.BestPrice(nil) + e.log.Debug("rebasing pool", + logging.String("id", pool.ID), + logging.String("fair-price", fairPrice.String()), + logging.String("target", target.String()), + logging.String("slippage", tol.String()), + ) + if fairPrice.EQ(target) { + return nil + } + + // calculate slippage as a factor of the mark-price so we can allow for a trades at prices +/- either side of the mark price, depending on side + slippage, _ := num.UintFromDecimal(target.ToDecimal().Mul(tol)) + + // this is the order the pool will submit to rebase itself such that its fair-price is roughly the mark price + order := &types.OrderSubmission{ + MarketID: pool.market, + Price: num.UintZero(), + TimeInForce: types.OrderTimeInForceFOK, + Type: types.OrderTypeLimit, + Reference: fmt.Sprintf("amm-rebase-%s", pool.ID), + } + + if target.GT(fairPrice) { + // pool base price is lower than market price, it will need to sell to lower its fair-price + order.Side = types.SideSell + order.Price.Sub(target, slippage) + } else { + order.Side = types.SideBuy + order.Price.Add(target, slippage) + } + + // ask the pool for the volume it would need to shift to get its price to target + // the order side is the side of the order that will trade with it, so needs to be the opposite + order.Size = pool.TradableVolumeInRange(types.OtherSide(order.Side), fairPrice, target) + if order.Size == 0 { + // fair-price is so close to target price that the volume to shift it is too small, but thats ok + return nil + } + + // need to scale make to market precision here because thats what SubmitOrderWithIDGeneratorAndOrderID expects + order.Price, _ = num.UintFromDecimal(order.Price.ToDecimal().Div(e.priceFactor)) + + e.log.Debug("submitting order to rebase after scale", + logging.Uint64("size", order.Size), + logging.String("price", order.Price.String()), + logging.String("side", order.Side.String()), + ) + + conf, err := e.market.SubmitOrderWithIDGeneratorAndOrderID(ctx, order, pool.SubAccount, idgen, idgen.NextID(), true) + if err != nil { + return fmt.Errorf("rebasing trade failed: %w", err) + } + + if conf.Order.Status != types.OrderStatusFilled { + return ErrRebaseOrderDidNotTrade + } + return nil +} + +func (e *Engine) GetAMMPoolsBySubAccount() map[string]common.AMMPool { + ret := make(map[string]common.AMMPool, len(e.pools)) + for _, v := range e.pools { + ret[v.SubAccount] = v + } + return ret +} + +func (e *Engine) GetAllSubAccounts() []string { + ret := make([]string, 0, len(e.subAccounts)) + for _, subAccount := range e.subAccounts { + ret = append(ret, subAccount) + } + return ret +} + +func (e *Engine) add(p *Pool) { + e.pools[p.party] = p + e.poolsCpy = append(e.poolsCpy, p) + e.subAccounts[p.SubAccount] = p.party + e.marketActivityTracker.AddAMMSubAccount(e.market.GetSettlementAsset(), e.market.GetID(), p.SubAccount) +} + +func (e *Engine) remove(ctx context.Context, party string) { + for i := range e.poolsCpy { + if e.poolsCpy[i].party == party { + e.poolsCpy = append(e.poolsCpy[:i], e.poolsCpy[i+1:]...) + break + } + } + + pool := e.pools[party] + delete(e.pools, party) + delete(e.subAccounts, pool.SubAccount) + e.sendUpdate(ctx, pool) + e.marketActivityTracker.RemoveAMMSubAccount(e.market.GetSettlementAsset(), e.market.GetID(), pool.SubAccount) +} + +func DeriveSubAccount( + party, market, version string, + index uint64, +) string { + hash := crypto.Hash([]byte(fmt.Sprintf("%v%v%v%v", version, market, party, index))) + return hex.EncodeToString(hash) +} diff --git a/core/execution/amm/engine_test.go b/core/execution/amm/engine_test.go new file mode 100644 index 00000000000..fe4889349e1 --- /dev/null +++ b/core/execution/amm/engine_test.go @@ -0,0 +1,855 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package amm + +import ( + "context" + "testing" + "time" + + bmocks "code.vegaprotocol.io/vega/core/broker/mocks" + "code.vegaprotocol.io/vega/core/events" + "code.vegaprotocol.io/vega/core/execution/amm/mocks" + "code.vegaprotocol.io/vega/core/execution/common" + cmocks "code.vegaprotocol.io/vega/core/execution/common/mocks" + "code.vegaprotocol.io/vega/core/types" + vgcontext "code.vegaprotocol.io/vega/libs/context" + vgcrypto "code.vegaprotocol.io/vega/libs/crypto" + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/libs/ptr" + "code.vegaprotocol.io/vega/logging" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestSubmitAMM(t *testing.T) { + t.Run("test one pool per party", testOnePoolPerParty) + t.Run("test rebase on submit", testRebaseOnSubmit) + t.Run("test rebase on submit order fails", testRebaseOnSubmitOrderFails) + t.Run("test rebase on submit order did not trade", testRebaseOnSubmitOrderDidNotTrade) + t.Run("test rebase on submit order target is base", testSubmitTargetIsBase) + t.Run("test rebase on submit order target out of bounds", testSubmitTargetIsOutOfBounds) +} + +func TestAMMTrading(t *testing.T) { + t.Run("test basic submit order", testBasicSubmitOrder) + t.Run("test submit market order", testSubmitMarketOrder) + t.Run("test submit order pro rata", testSubmitOrderProRata) + t.Run("test best prices and volume", testBestPricesAndVolume) + + t.Run("test submit buy order across AMM boundary", testSubmitOrderAcrossAMMBoundary) + t.Run("test submit sell order across AMM boundary", testSubmitOrderAcrossAMMBoundarySell) +} + +func TestAmendAMM(t *testing.T) { + t.Run("test amend AMM which doesn't exist", testAmendAMMWhichDoesntExist) + t.Run("test amend AMM with rebase", testAmendAMMWithRebase) + t.Run("test amend AMM with sparse amend", testAmendAMMSparse) +} + +func TestClosingAMM(t *testing.T) { + t.Run("test closing a pool as reduce only when its position is 0", testClosingReduceOnlyPool) + t.Run("test amending closing pool makes it actives", testAmendMakesClosingPoolActive) + t.Run("test closing pool removed when position hits zero", testClosingPoolRemovedWhenPositionZero) + t.Run("test closing pool immediately", testClosingPoolImmediate) +} + +func TestStoppingAMM(t *testing.T) { + t.Run("test stopping distressed AMM", testStoppingDistressedAMM) + t.Run("test AMM with no balance is stopped", testAMMWithNoBalanceStopped) + t.Run("test market closure", testMarketClosure) +} + +func testOnePoolPerParty(t *testing.T) { + ctx := context.Background() + tst := getTestEngine(t) + + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil)) + + // when the party submits another, it is rejected + err := tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil) + require.ErrorContains(t, err, "party already own a pool for market") +} + +func testRebaseOnSubmit(t *testing.T) { + tst := getTestEngine(t) + ctx := context.Background() + + // the party will make this AMM submission + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + expectSubaccountCreation(t, tst, party, subAccount) + + // where the mark-price is away from the base price + target := num.NewUint(2100) + tst.pos.EXPECT().GetPositionsByParty(gomock.Any()).Times(2).Return( + []events.MarketPosition{&marketPosition{size: 0, averageEntry: num.UintZero()}}, + ) + + // so that an order will be submitting to rebase the pool + expectOrderSubmission(t, tst, subAccount, types.OrderStatusFilled, nil) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), target)) +} + +func testSubmitTargetIsBase(t *testing.T) { + tst := getTestEngine(t) + ctx := context.Background() + + // the party will make this AMM submission + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + expectSubaccountCreation(t, tst, party, subAccount) + + // where the mark-price is the same as the base price + target := num.NewUint(2000) + tst.pos.EXPECT().GetPositionsByParty(gomock.Any()).Times(1).Return( + []events.MarketPosition{&marketPosition{size: 0, averageEntry: num.UintZero()}}, + ) + + // so no rebasing order is necessary + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), target)) +} + +func testSubmitTargetIsOutOfBounds(t *testing.T) { + tst := getTestEngine(t) + ctx := context.Background() + + // the party will make this AMM submission + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + expectSubaccountCreation(t, tst, party, subAccount) + + // where the mark-price is the same as the base price + target := num.NewUint(1) + + // the submission will fail so subaccount will be emptied + expectSubAccountUpdate(t, tst, party, subAccount, 1000) + err := tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), target) + require.ErrorIs(t, ErrRebaseTargetOutsideBounds, err) +} + +func testRebaseOnSubmitOrderFails(t *testing.T) { + tst := getTestEngine(t) + ctx := context.Background() + + // the party will make this AMM submission + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + expectSubaccountCreation(t, tst, party, subAccount) + + // where the mark-price is away from the base price + target := num.NewUint(2100) + tst.pos.EXPECT().GetPositionsByParty(gomock.Any()).Times(2).Return( + []events.MarketPosition{&marketPosition{size: 0, averageEntry: num.UintZero()}}, + ) + + // so that an order will be submitting to rebase the pool + expectOrderSubmission(t, tst, subAccount, types.OrderStatusStopped, assert.AnError) + + // the subaccount balances will be reverted + expectSubAccountUpdate(t, tst, party, subAccount, 1000) + + err := tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), target) + require.ErrorIs(t, err, assert.AnError) +} + +func testRebaseOnSubmitOrderDidNotTrade(t *testing.T) { + tst := getTestEngine(t) + ctx := context.Background() + + // the party will make this AMM submission + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + expectSubaccountCreation(t, tst, party, subAccount) + + // where the mark-price is away from the base price + target := num.NewUint(2100) + tst.pos.EXPECT().GetPositionsByParty(gomock.Any()).Times(2).Return( + []events.MarketPosition{&marketPosition{size: 0, averageEntry: num.UintZero()}}, + ) + + // so that an order will be submitting to rebase the pool + expectOrderSubmission(t, tst, subAccount, types.OrderStatusStopped, nil) + + // the subaccount balances will be reverted + expectSubAccountUpdate(t, tst, party, subAccount, 1000) + + err := tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), target) + require.ErrorIs(t, err, ErrRebaseOrderDidNotTrade) +} + +func testAmendAMMWhichDoesntExist(t *testing.T) { + ctx := context.Background() + tst := getTestEngine(t) + + // make an amend when the party doesn't have a pool + party, _ := getParty(t, tst) + amend := getPoolAmendment(t, party, tst.marketID) + + err := tst.engine.AmendAMM(ctx, amend, vgcrypto.RandomHash()) + require.ErrorIs(t, err, ErrNoPoolMatchingParty) +} + +func testAmendAMMWithRebase(t *testing.T) { + ctx := context.Background() + tst := getTestEngine(t) + + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil)) + + // now amend it so that we have to rebase the pool + amend := getPoolAmendment(t, party, tst.marketID) + + expectSubAccountUpdate(t, tst, party, subAccount, 1000) + tst.pos.EXPECT().GetPositionsByParty(gomock.Any()).Times(3).Return( + []events.MarketPosition{&marketPosition{size: 0, averageEntry: num.UintZero()}}, + ) + + // so that an order will be submitting to rebase the pool + expectOrderSubmission(t, tst, subAccount, types.OrderStatusFilled, nil) + + err := tst.engine.AmendAMM(ctx, amend, vgcrypto.RandomHash()) + require.NoError(t, err) +} + +func testAmendAMMSparse(t *testing.T) { + ctx := context.Background() + tst := getTestEngine(t) + + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + expectSubaccountCreation(t, tst, party, subAccount) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil)) + + amend := getPoolAmendment(t, party, tst.marketID) + // no amend to the commitment amount + amend.CommitmentAmount = nil + // no amend to the margin factors either + amend.Parameters.MarginRatioAtLowerBound = nil + amend.Parameters.MarginRatioAtUpperBound = nil + // to change something at least, inc the base + bounds by 1 + amend.Parameters.Base.AddSum(num.UintOne()) + amend.Parameters.UpperBound.AddSum(num.UintOne()) + amend.Parameters.LowerBound.AddSum(num.UintOne()) + + tst.pos.EXPECT().GetPositionsByParty(gomock.Any()).Times(3).Return( + []events.MarketPosition{&marketPosition{size: 0, averageEntry: num.UintZero()}}, + ) + + // so that an order will be submitting to rebase the pool + expectOrderSubmission(t, tst, subAccount, types.OrderStatusFilled, nil) + + err := tst.engine.AmendAMM(ctx, amend, vgcrypto.RandomHash()) + require.NoError(t, err) +} + +func testBasicSubmitOrder(t *testing.T) { + ctx := context.Background() + tst := getTestEngine(t) + + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil)) + + // now submit an order against it + agg := &types.Order{ + Size: 1000000, + Remaining: 1000000, + Side: types.SideBuy, + Price: num.NewUint(2100), + Type: types.OrderTypeLimit, + } + + ensureBalances(t, tst.col, 10000000000) + ensurePosition(t, tst.pos, 0, num.NewUint(0)) + orders := tst.engine.SubmitOrder(agg, num.NewUint(2000), num.NewUint(2020)) + require.Len(t, orders, 1) + assert.Equal(t, "2009", orders[0].Price.String()) + assert.Equal(t, uint64(242367), orders[0].Size) + + // AMM is now short, but another order comes in that will flip its position to long + agg = &types.Order{ + Size: 1000000, + Remaining: 1000000, + Side: types.SideSell, + Price: num.NewUint(1900), + } + + ensureBalancesN(t, tst.col, 10000000000, 2) + orders = tst.engine.SubmitOrder(agg, num.NewUint(2020), num.NewUint(1990)) + require.Len(t, orders, 1) + assert.Equal(t, "2035", orders[0].Price.String()) + // note that this volume being bigger than 242367 above means we've moved back to position, then flipped + // sign, and took volume from the other curve. + assert.Equal(t, uint64(371231), orders[0].Size) +} + +func testSubmitMarketOrder(t *testing.T) { + ctx := context.Background() + tst := getTestEngine(t) + + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil)) + + // now submit an order against it + agg := &types.Order{ + Size: 1000000, + Remaining: 1000000, + Side: types.SideSell, + Price: num.NewUint(0), + Type: types.OrderTypeMarket, + } + + ensurePosition(t, tst.pos, 0, num.NewUint(0)) + orders := tst.engine.SubmitOrder(agg, num.NewUint(1980), num.NewUint(1990)) + require.Len(t, orders, 1) + assert.Equal(t, "2005", orders[0].Price.String()) + assert.Equal(t, uint64(129839), orders[0].Size) +} + +func testSubmitOrderProRata(t *testing.T) { + ctx := context.Background() + tst := getTestEngine(t) + + // create three pools + for i := 0; i < 3; i++ { + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil)) + } + + ensureBalancesN(t, tst.col, 10000000000, 3) + ensurePositionN(t, tst.pos, 0, num.NewUint(0), 3) + + // now submit an order against it + agg := &types.Order{ + Size: 666, + Remaining: 666, + Side: types.SideBuy, + Price: num.NewUint(2100), + } + orders := tst.engine.SubmitOrder(agg, num.NewUint(2010), num.NewUint(2020)) + require.Len(t, orders, 3) + for _, o := range orders { + assert.Equal(t, "2000", o.Price.String()) + assert.Equal(t, uint64(222), o.Size) + } +} + +func testSubmitOrderAcrossAMMBoundary(t *testing.T) { + ctx := context.Background() + tst := getTestEngine(t) + + // create three pools + for i := 0; i < 3; i++ { + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + // going to shrink the boundaries + submit.Parameters.LowerBound.Add(submit.Parameters.LowerBound, num.NewUint(uint64(i*50))) + submit.Parameters.UpperBound.Sub(submit.Parameters.UpperBound, num.NewUint(uint64(i*50))) + + expectSubaccountCreation(t, tst, party, subAccount) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil)) + } + + ensureBalancesN(t, tst.col, 10000000000, -1) + ensurePositionN(t, tst.pos, 0, num.NewUint(0), -1) + + // now submit an order against it + agg := &types.Order{ + Size: 1000000000000, + Remaining: 1000000000000, + Side: types.SideBuy, + Price: num.NewUint(2200), + } + + // pools upper boundaries are 2100, 2150, 2200, and we submit a big order + // we expect to trade with each pool in these three chunks + // - first 3 orders with all pools from [2000, 2100] + // - then 2 orders with the longer two pools from [2100, 2150] + // - then 1 order just the last pool from [2150, 2200] + // so 6 orders in total + orders := tst.engine.SubmitOrder(agg, num.NewUint(2000), num.NewUint(2200)) + require.Len(t, orders, 6) + + // first round, three orders moving all pool's to the upper boundary of the shortest + assert.Equal(t, "2049", orders[0].Price.String()) + assert.Equal(t, "2049", orders[1].Price.String()) + assert.Equal(t, "2049", orders[2].Price.String()) + + // second round, 2 orders moving all pool's to the upper boundary of the second shortest + assert.Equal(t, "2124", orders[3].Price.String()) + assert.Equal(t, "2124", orders[4].Price.String()) + + // third round, 1 orders moving the last pool to its boundary + assert.Equal(t, "2174", orders[5].Price.String()) +} + +func testSubmitOrderAcrossAMMBoundarySell(t *testing.T) { + ctx := context.Background() + tst := getTestEngine(t) + + // create three pools + for i := 0; i < 3; i++ { + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + // going to shrink the boundaries + submit.Parameters.LowerBound.Add(submit.Parameters.LowerBound, num.NewUint(uint64(i*50))) + submit.Parameters.UpperBound.Sub(submit.Parameters.UpperBound, num.NewUint(uint64(i*50))) + + expectSubaccountCreation(t, tst, party, subAccount) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil)) + } + + ensureBalancesN(t, tst.col, 10000000000, -1) + ensurePositionN(t, tst.pos, 0, num.NewUint(0), -1) + + // now submit an order against it + agg := &types.Order{ + Size: 1000000000000, + Remaining: 1000000000000, + Side: types.SideSell, + Price: num.NewUint(1800), + } + + // pools lower boundaries are 1800, 1850, 1900, and we submit a big order + // we expect to trade with each pool in these three chunks + // - first 3 orders with all pools from [2000, 1900] + // - then 2 orders with the longer two pools from [1900, 1850] + // - then 1 order just the last pool from [1850, 1800] + // so 6 orders in total + // orders := tst.engine.SubmitOrder(agg, num.NewUint(2000), num.NewUint(1800)) + orders := tst.engine.SubmitOrder(agg, num.NewUint(2000), num.NewUint(1800)) + require.Len(t, orders, 6) + + // first round, three orders moving all pool's to the upper boundary of the shortest + assert.Equal(t, "2053", orders[0].Price.String()) + assert.Equal(t, "2053", orders[1].Price.String()) + assert.Equal(t, "2053", orders[2].Price.String()) + + // second round, 2 orders moving all pool's to the upper boundary of the second shortest + assert.Equal(t, "1923", orders[3].Price.String()) + assert.Equal(t, "1923", orders[4].Price.String()) + + // third round, 1 orders moving the last pool to its boundary + assert.Equal(t, "1872", orders[5].Price.String()) +} + +func testBestPricesAndVolume(t *testing.T) { + ctx := context.Background() + tst := getTestEngine(t) + + // create three pools + for i := 0; i < 3; i++ { + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil)) + } + + tst.pos.EXPECT().GetPositionsByParty(gomock.Any()).Times(9).Return( + []events.MarketPosition{&marketPosition{size: 0, averageEntry: num.NewUint(0)}}, + ) + + bid, bvolume, ask, avolume := tst.engine.BestPricesAndVolumes() + assert.Equal(t, "1999", bid.String()) + assert.Equal(t, "2001", ask.String()) + assert.Equal(t, uint64(38526), bvolume) + assert.Equal(t, uint64(36615), avolume) +} + +func testClosingReduceOnlyPool(t *testing.T) { + ctx := context.Background() + tst := getTestEngine(t) + + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil)) + + // pool position is zero it should get removed right away with no fuss + ensurePosition(t, tst.pos, 0, num.UintZero()) + ensurePosition(t, tst.pos, 0, num.UintZero()) + expectSubAccountRelease(t, tst, party, subAccount) + cancel := getCancelSubmission(t, party, tst.marketID, types.AMMPoolCancellationMethodReduceOnly) + mevt, err := tst.engine.CancelAMM(ctx, cancel) + require.NoError(t, err) + assert.Nil(t, mevt) // no closeout necessary so not event + tst.engine.OnMTM(ctx) + assert.Len(t, tst.engine.pools, 0) +} + +func testClosingPoolImmediate(t *testing.T) { + ctx := context.Background() + tst := getTestEngine(t) + + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil)) + + // pool has a position but gets closed anyway + ensurePosition(t, tst.pos, 12, num.UintZero()) + expectSubAccountRelease(t, tst, party, subAccount) + cancel := getCancelSubmission(t, party, tst.marketID, types.AMMPoolCancellationMethodImmediate) + mevt, err := tst.engine.CancelAMM(ctx, cancel) + require.NoError(t, err) + assert.Nil(t, mevt) // no closeout necessary so not event + assert.Len(t, tst.engine.pools, 0) +} + +func testAmendMakesClosingPoolActive(t *testing.T) { + ctx := context.Background() + tst := getTestEngine(t) + + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil)) + + // pool position is non-zero so it''l hang around + ensurePosition(t, tst.pos, 12, num.UintZero()) + cancel := getCancelSubmission(t, party, tst.marketID, types.AMMPoolCancellationMethodReduceOnly) + closeout, err := tst.engine.CancelAMM(ctx, cancel) + require.NoError(t, err) + assert.Nil(t, closeout) + tst.engine.OnMTM(ctx) + assert.Len(t, tst.engine.pools, 1) + assert.True(t, tst.engine.poolsCpy[0].closing()) + + tst.pos.EXPECT().GetPositionsByParty(gomock.Any()).Times(3).Return( + []events.MarketPosition{&marketPosition{size: 0, averageEntry: num.UintZero()}}, + ) + expectSubAccountUpdate(t, tst, party, subAccount, 1000) + amend := getPoolAmendment(t, party, tst.marketID) + require.NoError(t, tst.engine.AmendAMM(ctx, amend, vgcrypto.RandomHash())) + + // pool is active again + assert.False(t, tst.engine.poolsCpy[0].closing()) +} + +func testClosingPoolRemovedWhenPositionZero(t *testing.T) { + ctx := vgcontext.WithTraceID(context.Background(), vgcrypto.RandomHash()) + tst := getTestEngine(t) + + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil)) + + // pool position is non-zero so it''l hang around + ensurePosition(t, tst.pos, 12, num.UintZero()) + cancel := getCancelSubmission(t, party, tst.marketID, types.AMMPoolCancellationMethodReduceOnly) + closeout, err := tst.engine.CancelAMM(ctx, cancel) + require.NoError(t, err) + assert.Nil(t, closeout) + tst.engine.OnMTM(ctx) + assert.True(t, tst.engine.poolsCpy[0].closing()) + + // position is lower but non-zero + ensurePosition(t, tst.pos, 1, num.UintZero()) + tst.engine.OnMTM(ctx) + assert.True(t, tst.engine.poolsCpy[0].closing()) + + // position is zero, it will get removed + ensurePositionN(t, tst.pos, 0, num.UintZero(), 2) + expectSubAccountRelease(t, tst, party, subAccount) + tst.engine.OnMTM(ctx) + assert.Len(t, tst.engine.poolsCpy, 0) +} + +func testStoppingDistressedAMM(t *testing.T) { + ctx := context.Background() + tst := getTestEngine(t) + + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil)) + + // call remove distressed with a AMM's owner will not remove the pool + closed := []events.MarketPosition{ + mpos{party}, + } + tst.engine.RemoveDistressed(ctx, closed) + assert.Len(t, tst.engine.pools, 1) + + // call remove distressed with a AMM's subacouunt will remove the pool + closed = []events.MarketPosition{ + mpos{subAccount}, + } + tst.engine.RemoveDistressed(ctx, closed) + assert.Len(t, tst.engine.pools, 0) +} + +func testAMMWithNoBalanceStopped(t *testing.T) { + ctx := vgcontext.WithTraceID(context.Background(), vgcrypto.RandomHash()) + tst := getTestEngine(t) + + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil)) + ensureBalances(t, tst.col, 10000) + tst.engine.OnTick(ctx, time.Now()) + assert.Len(t, tst.engine.pools, 1) + + ensureBalances(t, tst.col, 0) + tst.engine.OnTick(ctx, time.Now()) + assert.Len(t, tst.engine.pools, 0) +} + +func testMarketClosure(t *testing.T) { + ctx := vgcontext.WithTraceID(context.Background(), vgcrypto.RandomHash()) + tst := getTestEngine(t) + + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + require.NoError(t, tst.engine.SubmitAMM(ctx, submit, vgcrypto.RandomHash(), nil)) + + expectSubAccountClose(t, tst, party, subAccount) + require.NoError(t, tst.engine.MarketClosing(ctx)) + assert.Len(t, tst.engine.poolsCpy, 0) +} + +func expectSubaccountCreation(t *testing.T, tst *tstEngine, party, subAccount string) { + t.Helper() + + // accounts are created + tst.col.EXPECT().CreatePartyAMMsSubAccounts(gomock.Any(), party, subAccount, tst.assetID, tst.marketID).Times(1) + + expectSubAccountUpdate(t, tst, party, subAccount, 0) +} + +func expectSubAccountUpdate(t *testing.T, tst *tstEngine, party, subAccount string, balance uint64) { + t.Helper() + + // sub-account starts with zero balance + tst.col.EXPECT().GetPartyGeneralAccount(gomock.Any(), gomock.Any()).Times(1).Return(getAccount(balance), nil) + tst.col.EXPECT().GetPartyMarginAccount(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return(getAccount(balance), nil) + + // account is update from party's main accounts + tst.col.EXPECT().SubAccountUpdate( + gomock.Any(), + party, + subAccount, + tst.assetID, + tst.marketID, + gomock.Any(), + gomock.Any(), + ).Times(1).Return(&types.LedgerMovement{}, nil) +} + +func expectSubAccountRelease(t *testing.T, tst *tstEngine, party, subAccount string) { + t.Helper() + // account is update from party's main accounts + tst.col.EXPECT().SubAccountRelease( + gomock.Any(), + party, + subAccount, + tst.assetID, + tst.marketID, + gomock.Any(), + ).Times(1).Return([]*types.LedgerMovement{}, nil, nil) +} + +func expectSubAccountClose(t *testing.T, tst *tstEngine, party, subAccount string) { + t.Helper() + tst.col.EXPECT().SubAccountClosed( + gomock.Any(), + party, + subAccount, + tst.assetID, + tst.marketID).Times(1).Return([]*types.LedgerMovement{}, nil) +} + +func expectOrderSubmission(t *testing.T, tst *tstEngine, subAccount string, status types.OrderStatus, err error) { + t.Helper() + + conf := &types.OrderConfirmation{ + Order: &types.Order{ + Status: status, + }, + } + tst.market.EXPECT().SubmitOrderWithIDGeneratorAndOrderID( + gomock.Any(), + gomock.Any(), + subAccount, + gomock.Any(), + gomock.Any(), + gomock.Any(), + ).Times(1).Return(conf, err) +} + +func getParty(t *testing.T, tst *tstEngine) (string, string) { + t.Helper() + + party := vgcrypto.RandomHash() + subAccount := DeriveSubAccount(party, tst.marketID, "AMMv1", 0) + return party, subAccount +} + +func getPoolSubmission(t *testing.T, party, market string) *types.SubmitAMM { + t.Helper() + return &types.SubmitAMM{ + AMMBaseCommand: types.AMMBaseCommand{ + Party: party, + MarketID: market, + SlippageTolerance: num.DecimalFromFloat(0.1), + }, + CommitmentAmount: num.NewUint(10000000000), + Parameters: &types.ConcentratedLiquidityParameters{ + Base: num.NewUint(2000), + LowerBound: num.NewUint(1800), + UpperBound: num.NewUint(2200), + MarginRatioAtLowerBound: ptr.From(num.DecimalOne()), + MarginRatioAtUpperBound: ptr.From(num.DecimalOne()), + }, + } +} + +func getPoolAmendment(t *testing.T, party, market string) *types.AmendAMM { + t.Helper() + return &types.AmendAMM{ + AMMBaseCommand: types.AMMBaseCommand{ + Party: party, + MarketID: market, + SlippageTolerance: num.DecimalFromFloat(0.1), + }, + CommitmentAmount: num.NewUint(10000000000), + Parameters: &types.ConcentratedLiquidityParameters{ + Base: num.NewUint(2100), + LowerBound: num.NewUint(1900), + UpperBound: num.NewUint(2300), + MarginRatioAtLowerBound: ptr.From(num.DecimalOne()), + MarginRatioAtUpperBound: ptr.From(num.DecimalOne()), + }, + } +} + +func getCancelSubmission(t *testing.T, party, market string, method types.AMMPoolCancellationMethod) *types.CancelAMM { + t.Helper() + return &types.CancelAMM{ + MarketID: market, + Party: party, + Method: method, + } +} + +type tstEngine struct { + engine *Engine + broker *bmocks.MockBroker + market *mocks.MockMarket + col *mocks.MockCollateral + pos *mocks.MockPosition + ctrl *gomock.Controller + + marketID string + assetID string +} + +func getTestEngine(t *testing.T) *tstEngine { + t.Helper() + ctrl := gomock.NewController(t) + col := mocks.NewMockCollateral(ctrl) + pos := mocks.NewMockPosition(ctrl) + market := mocks.NewMockMarket(ctrl) + risk := mocks.NewMockRisk(ctrl) + broker := bmocks.NewMockBroker(ctrl) + + marketID := vgcrypto.RandomHash() + assetID := vgcrypto.RandomHash() + + broker.EXPECT().Send(gomock.Any()).AnyTimes() + market.EXPECT().GetID().AnyTimes().Return(marketID) + market.EXPECT().GetSettlementAsset().AnyTimes().Return(assetID) + col.EXPECT().GetAssetQuantum(assetID).AnyTimes().Return(num.DecimalOne(), nil) + + risk.EXPECT().GetRiskFactors().AnyTimes().Return(&types.RiskFactor{Market: "", Short: num.DecimalOne(), Long: num.DecimalOne()}) + risk.EXPECT().GetScalingFactors().AnyTimes().Return(&types.ScalingFactors{InitialMargin: num.DecimalOne()}) + risk.EXPECT().GetSlippage().AnyTimes().Return(num.DecimalOne()) + + teams := cmocks.NewMockTeams(ctrl) + balanceChecker := cmocks.NewMockAccountBalanceChecker(ctrl) + + mat := common.NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) + + eng := New(logging.NewTestLogger(), broker, col, market, risk, pos, num.DecimalOne(), num.DecimalOne(), mat) + + // do an ontick to initialise the idgen + ctx := vgcontext.WithTraceID(context.Background(), vgcrypto.RandomHash()) + eng.OnTick(ctx, time.Now()) + + return &tstEngine{ + engine: eng, + broker: broker, + market: market, + col: col, + pos: pos, + ctrl: ctrl, + marketID: marketID, + assetID: assetID, + } +} + +func getAccount(balance uint64) *types.Account { + return &types.Account{ + Balance: num.NewUint(balance), + } +} + +type mpos struct { + party string +} + +func (m mpos) AverageEntryPrice() *num.Uint { return num.UintZero() } +func (m mpos) Party() string { return m.party } +func (m mpos) Size() int64 { return 0 } +func (m mpos) Buy() int64 { return 0 } +func (m mpos) Sell() int64 { return 0 } +func (m mpos) Price() *num.Uint { return num.UintZero() } +func (m mpos) BuySumProduct() *num.Uint { return num.UintZero() } +func (m mpos) SellSumProduct() *num.Uint { return num.UintZero() } +func (m mpos) ClearPotentials() {} +func (m mpos) VWBuy() *num.Uint { return num.UintZero() } +func (m mpos) VWSell() *num.Uint { return num.UintZero() } diff --git a/core/execution/amm/mocks/mocks.go b/core/execution/amm/mocks/mocks.go new file mode 100644 index 00000000000..c28d7176ffb --- /dev/null +++ b/core/execution/amm/mocks/mocks.go @@ -0,0 +1,334 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: code.vegaprotocol.io/vega/core/execution/amm (interfaces: Collateral,Position,Market,Risk) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + events "code.vegaprotocol.io/vega/core/events" + common "code.vegaprotocol.io/vega/core/execution/common" + types "code.vegaprotocol.io/vega/core/types" + num "code.vegaprotocol.io/vega/libs/num" + vega "code.vegaprotocol.io/vega/protos/vega" + gomock "github.com/golang/mock/gomock" + decimal "github.com/shopspring/decimal" +) + +// MockCollateral is a mock of Collateral interface. +type MockCollateral struct { + ctrl *gomock.Controller + recorder *MockCollateralMockRecorder +} + +// MockCollateralMockRecorder is the mock recorder for MockCollateral. +type MockCollateralMockRecorder struct { + mock *MockCollateral +} + +// NewMockCollateral creates a new mock instance. +func NewMockCollateral(ctrl *gomock.Controller) *MockCollateral { + mock := &MockCollateral{ctrl: ctrl} + mock.recorder = &MockCollateralMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockCollateral) EXPECT() *MockCollateralMockRecorder { + return m.recorder +} + +// CreatePartyAMMsSubAccounts mocks base method. +func (m *MockCollateral) CreatePartyAMMsSubAccounts(arg0 context.Context, arg1, arg2, arg3, arg4 string) (*types.Account, *types.Account, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreatePartyAMMsSubAccounts", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(*types.Account) + ret1, _ := ret[1].(*types.Account) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// CreatePartyAMMsSubAccounts indicates an expected call of CreatePartyAMMsSubAccounts. +func (mr *MockCollateralMockRecorder) CreatePartyAMMsSubAccounts(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreatePartyAMMsSubAccounts", reflect.TypeOf((*MockCollateral)(nil).CreatePartyAMMsSubAccounts), arg0, arg1, arg2, arg3, arg4) +} + +// GetAssetQuantum mocks base method. +func (m *MockCollateral) GetAssetQuantum(arg0 string) (decimal.Decimal, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAssetQuantum", arg0) + ret0, _ := ret[0].(decimal.Decimal) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetAssetQuantum indicates an expected call of GetAssetQuantum. +func (mr *MockCollateralMockRecorder) GetAssetQuantum(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAssetQuantum", reflect.TypeOf((*MockCollateral)(nil).GetAssetQuantum), arg0) +} + +// GetPartyGeneralAccount mocks base method. +func (m *MockCollateral) GetPartyGeneralAccount(arg0, arg1 string) (*types.Account, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetPartyGeneralAccount", arg0, arg1) + ret0, _ := ret[0].(*types.Account) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetPartyGeneralAccount indicates an expected call of GetPartyGeneralAccount. +func (mr *MockCollateralMockRecorder) GetPartyGeneralAccount(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPartyGeneralAccount", reflect.TypeOf((*MockCollateral)(nil).GetPartyGeneralAccount), arg0, arg1) +} + +// GetPartyMarginAccount mocks base method. +func (m *MockCollateral) GetPartyMarginAccount(arg0, arg1, arg2 string) (*types.Account, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetPartyMarginAccount", arg0, arg1, arg2) + ret0, _ := ret[0].(*types.Account) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetPartyMarginAccount indicates an expected call of GetPartyMarginAccount. +func (mr *MockCollateralMockRecorder) GetPartyMarginAccount(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPartyMarginAccount", reflect.TypeOf((*MockCollateral)(nil).GetPartyMarginAccount), arg0, arg1, arg2) +} + +// SubAccountClosed mocks base method. +func (m *MockCollateral) SubAccountClosed(arg0 context.Context, arg1, arg2, arg3, arg4 string) ([]*types.LedgerMovement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SubAccountClosed", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].([]*types.LedgerMovement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SubAccountClosed indicates an expected call of SubAccountClosed. +func (mr *MockCollateralMockRecorder) SubAccountClosed(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubAccountClosed", reflect.TypeOf((*MockCollateral)(nil).SubAccountClosed), arg0, arg1, arg2, arg3, arg4) +} + +// SubAccountRelease mocks base method. +func (m *MockCollateral) SubAccountRelease(arg0 context.Context, arg1, arg2, arg3, arg4 string, arg5 events.MarketPosition) ([]*types.LedgerMovement, events.Margin, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SubAccountRelease", arg0, arg1, arg2, arg3, arg4, arg5) + ret0, _ := ret[0].([]*types.LedgerMovement) + ret1, _ := ret[1].(events.Margin) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// SubAccountRelease indicates an expected call of SubAccountRelease. +func (mr *MockCollateralMockRecorder) SubAccountRelease(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubAccountRelease", reflect.TypeOf((*MockCollateral)(nil).SubAccountRelease), arg0, arg1, arg2, arg3, arg4, arg5) +} + +// SubAccountUpdate mocks base method. +func (m *MockCollateral) SubAccountUpdate(arg0 context.Context, arg1, arg2, arg3, arg4 string, arg5 vega.TransferType, arg6 *num.Uint) (*types.LedgerMovement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SubAccountUpdate", arg0, arg1, arg2, arg3, arg4, arg5, arg6) + ret0, _ := ret[0].(*types.LedgerMovement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SubAccountUpdate indicates an expected call of SubAccountUpdate. +func (mr *MockCollateralMockRecorder) SubAccountUpdate(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubAccountUpdate", reflect.TypeOf((*MockCollateral)(nil).SubAccountUpdate), arg0, arg1, arg2, arg3, arg4, arg5, arg6) +} + +// MockPosition is a mock of Position interface. +type MockPosition struct { + ctrl *gomock.Controller + recorder *MockPositionMockRecorder +} + +// MockPositionMockRecorder is the mock recorder for MockPosition. +type MockPositionMockRecorder struct { + mock *MockPosition +} + +// NewMockPosition creates a new mock instance. +func NewMockPosition(ctrl *gomock.Controller) *MockPosition { + mock := &MockPosition{ctrl: ctrl} + mock.recorder = &MockPositionMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockPosition) EXPECT() *MockPositionMockRecorder { + return m.recorder +} + +// GetPositionsByParty mocks base method. +func (m *MockPosition) GetPositionsByParty(arg0 ...string) []events.MarketPosition { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range arg0 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetPositionsByParty", varargs...) + ret0, _ := ret[0].([]events.MarketPosition) + return ret0 +} + +// GetPositionsByParty indicates an expected call of GetPositionsByParty. +func (mr *MockPositionMockRecorder) GetPositionsByParty(arg0 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPositionsByParty", reflect.TypeOf((*MockPosition)(nil).GetPositionsByParty), arg0...) +} + +// MockMarket is a mock of Market interface. +type MockMarket struct { + ctrl *gomock.Controller + recorder *MockMarketMockRecorder +} + +// MockMarketMockRecorder is the mock recorder for MockMarket. +type MockMarketMockRecorder struct { + mock *MockMarket +} + +// NewMockMarket creates a new mock instance. +func NewMockMarket(ctrl *gomock.Controller) *MockMarket { + mock := &MockMarket{ctrl: ctrl} + mock.recorder = &MockMarketMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockMarket) EXPECT() *MockMarketMockRecorder { + return m.recorder +} + +// ClosePosition mocks base method. +func (m *MockMarket) ClosePosition(arg0 context.Context, arg1 string) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClosePosition", arg0, arg1) + ret0, _ := ret[0].(bool) + return ret0 +} + +// ClosePosition indicates an expected call of ClosePosition. +func (mr *MockMarketMockRecorder) ClosePosition(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClosePosition", reflect.TypeOf((*MockMarket)(nil).ClosePosition), arg0, arg1) +} + +// GetID mocks base method. +func (m *MockMarket) GetID() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetID") + ret0, _ := ret[0].(string) + return ret0 +} + +// GetID indicates an expected call of GetID. +func (mr *MockMarketMockRecorder) GetID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetID", reflect.TypeOf((*MockMarket)(nil).GetID)) +} + +// GetSettlementAsset mocks base method. +func (m *MockMarket) GetSettlementAsset() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetSettlementAsset") + ret0, _ := ret[0].(string) + return ret0 +} + +// GetSettlementAsset indicates an expected call of GetSettlementAsset. +func (mr *MockMarketMockRecorder) GetSettlementAsset() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSettlementAsset", reflect.TypeOf((*MockMarket)(nil).GetSettlementAsset)) +} + +// SubmitOrderWithIDGeneratorAndOrderID mocks base method. +func (m *MockMarket) SubmitOrderWithIDGeneratorAndOrderID(arg0 context.Context, arg1 *types.OrderSubmission, arg2 string, arg3 common.IDGenerator, arg4 string, arg5 bool) (*types.OrderConfirmation, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SubmitOrderWithIDGeneratorAndOrderID", arg0, arg1, arg2, arg3, arg4, arg5) + ret0, _ := ret[0].(*types.OrderConfirmation) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SubmitOrderWithIDGeneratorAndOrderID indicates an expected call of SubmitOrderWithIDGeneratorAndOrderID. +func (mr *MockMarketMockRecorder) SubmitOrderWithIDGeneratorAndOrderID(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubmitOrderWithIDGeneratorAndOrderID", reflect.TypeOf((*MockMarket)(nil).SubmitOrderWithIDGeneratorAndOrderID), arg0, arg1, arg2, arg3, arg4, arg5) +} + +// MockRisk is a mock of Risk interface. +type MockRisk struct { + ctrl *gomock.Controller + recorder *MockRiskMockRecorder +} + +// MockRiskMockRecorder is the mock recorder for MockRisk. +type MockRiskMockRecorder struct { + mock *MockRisk +} + +// NewMockRisk creates a new mock instance. +func NewMockRisk(ctrl *gomock.Controller) *MockRisk { + mock := &MockRisk{ctrl: ctrl} + mock.recorder = &MockRiskMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockRisk) EXPECT() *MockRiskMockRecorder { + return m.recorder +} + +// GetRiskFactors mocks base method. +func (m *MockRisk) GetRiskFactors() *types.RiskFactor { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetRiskFactors") + ret0, _ := ret[0].(*types.RiskFactor) + return ret0 +} + +// GetRiskFactors indicates an expected call of GetRiskFactors. +func (mr *MockRiskMockRecorder) GetRiskFactors() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRiskFactors", reflect.TypeOf((*MockRisk)(nil).GetRiskFactors)) +} + +// GetScalingFactors mocks base method. +func (m *MockRisk) GetScalingFactors() *types.ScalingFactors { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetScalingFactors") + ret0, _ := ret[0].(*types.ScalingFactors) + return ret0 +} + +// GetScalingFactors indicates an expected call of GetScalingFactors. +func (mr *MockRiskMockRecorder) GetScalingFactors() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetScalingFactors", reflect.TypeOf((*MockRisk)(nil).GetScalingFactors)) +} + +// GetSlippage mocks base method. +func (m *MockRisk) GetSlippage() decimal.Decimal { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetSlippage") + ret0, _ := ret[0].(decimal.Decimal) + return ret0 +} + +// GetSlippage indicates an expected call of GetSlippage. +func (mr *MockRiskMockRecorder) GetSlippage() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSlippage", reflect.TypeOf((*MockRisk)(nil).GetSlippage)) +} diff --git a/core/execution/amm/pool.go b/core/execution/amm/pool.go new file mode 100644 index 00000000000..bc97470f0be --- /dev/null +++ b/core/execution/amm/pool.go @@ -0,0 +1,648 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package amm + +import ( + "code.vegaprotocol.io/vega/core/positions" + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/libs/ptr" + snapshotpb "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" +) + +// ephemeralPosition keeps track of the pools position as if its generated orders had traded. +type ephemeralPosition struct { + size int64 + averageEntry *num.Uint +} + +type curve struct { + l *num.Uint // virtual liquidity + high *num.Uint // high price value, upper bound if upper curve, base price is lower curve + low *num.Uint // low price value, base price if upper curve, lower bound if lower curve + rf num.Decimal // commitment scaling factor + empty bool // if true the curve is of zero length and represents no liquidity on this side of the amm +} + +func (c *curve) volumeBetweenPrices(sqrt sqrtFn, st, nd *num.Uint) uint64 { + if c.l.IsZero() || c.empty { + return 0 + } + + st = num.Max(st, c.low) + nd = num.Min(nd, c.high) + + if st.GTE(nd) { + return 0 + } + + // abs(P(st) - P(nd)) + volume, _ := num.UintZero().Delta( + impliedPosition(sqrt(st), sqrt(c.high), c.l), + impliedPosition(sqrt(nd), sqrt(c.high), c.l), + ) + return volume.Uint64() +} + +type Pool struct { + ID string + SubAccount string + Commitment *num.Uint + ProposedFee num.Decimal + Parameters *types.ConcentratedLiquidityParameters + + asset string + market string + party string + collateral Collateral + position Position + priceFactor num.Decimal + positionFactor num.Decimal + + // current pool status + status types.AMMPoolStatus + + // sqrt function to use. + sqrt sqrtFn + + // the two curves joined at base-price used to determine price and volume in the pool + // lower is used when the pool is long. + lower *curve + upper *curve + + // during the matching process across price levels we need to keep tracking of the pools potential positions + // as if those matching orders were to trade. This is so that when we generate more orders at the next price level + // for the same incoming order, the second round of generated orders are priced as if the first round had traded. + eph *ephemeralPosition + + // one price tick + oneTick *num.Uint +} + +func NewPool( + id, + subAccount, + asset string, + submit *types.SubmitAMM, + sqrt sqrtFn, + collateral Collateral, + position Position, + rf *types.RiskFactor, + sf *types.ScalingFactors, + linearSlippage num.Decimal, + priceFactor num.Decimal, + positionFactor num.Decimal, +) *Pool { + oneTick, _ := num.UintFromDecimal(num.DecimalOne().Mul(priceFactor)) + pool := &Pool{ + ID: id, + SubAccount: subAccount, + Commitment: submit.CommitmentAmount, + ProposedFee: submit.ProposedFee, + Parameters: submit.Parameters, + market: submit.MarketID, + party: submit.Party, + asset: asset, + sqrt: sqrt, + collateral: collateral, + position: position, + priceFactor: priceFactor, + positionFactor: positionFactor, + oneTick: oneTick, + status: types.AMMPoolStatusActive, + } + pool.setCurves(rf, sf, linearSlippage) + return pool +} + +func NewPoolFromProto( + sqrt sqrtFn, + collateral Collateral, + position Position, + state *snapshotpb.PoolMapEntry_Pool, + party string, + priceFactor num.Decimal, +) *Pool { + oneTick, _ := num.UintFromDecimal(num.DecimalOne().Mul(priceFactor)) + return &Pool{ + ID: state.Id, + SubAccount: state.SubAccount, + Commitment: num.MustUintFromString(state.Commitment, 10), + Parameters: &types.ConcentratedLiquidityParameters{ + Base: num.MustUintFromString(state.Parameters.Base, 10), + LowerBound: num.MustUintFromString(state.Parameters.LowerBound, 10), + UpperBound: num.MustUintFromString(state.Parameters.UpperBound, 10), + MarginRatioAtLowerBound: ptr.From(num.MustDecimalFromString(state.Parameters.MarginRatioAtLowerBound)), + MarginRatioAtUpperBound: ptr.From(num.MustDecimalFromString(state.Parameters.MarginRatioAtUpperBound)), + }, + party: party, + market: state.Market, + asset: state.Asset, + sqrt: sqrt, + collateral: collateral, + position: position, + lower: &curve{ + l: num.MustUintFromString(state.Lower.L, 10), + high: num.MustUintFromString(state.Lower.High, 10), + low: num.MustUintFromString(state.Lower.Low, 10), + rf: num.MustDecimalFromString(state.Lower.Rf), + empty: state.Lower.Empty, + }, + upper: &curve{ + l: num.MustUintFromString(state.Upper.L, 10), + high: num.MustUintFromString(state.Upper.High, 10), + low: num.MustUintFromString(state.Upper.Low, 10), + rf: num.MustDecimalFromString(state.Upper.Rf), + empty: state.Upper.Empty, + }, + priceFactor: priceFactor, + oneTick: oneTick, + status: state.Status, + } +} + +func (p *Pool) IntoProto() *snapshotpb.PoolMapEntry_Pool { + return &snapshotpb.PoolMapEntry_Pool{ + Id: p.ID, + SubAccount: p.SubAccount, + Commitment: p.Commitment.String(), + Parameters: p.Parameters.ToProtoEvent(), + Market: p.market, + Asset: p.asset, + Lower: &snapshotpb.PoolMapEntry_Curve{ + L: p.lower.l.String(), + High: p.lower.high.String(), + Low: p.lower.low.String(), + Rf: p.lower.rf.String(), + Empty: p.lower.empty, + }, + Upper: &snapshotpb.PoolMapEntry_Curve{ + L: p.upper.l.String(), + High: p.upper.high.String(), + Low: p.upper.low.String(), + Rf: p.upper.rf.String(), + Empty: p.lower.empty, + }, + Status: p.status, + } +} + +func (p *Pool) Update( + amend *types.AmendAMM, + rf *types.RiskFactor, + sf *types.ScalingFactors, + linearSlippage num.Decimal, +) *types.ConcentratedLiquidityParameters { + if amend.CommitmentAmount != nil { + p.Commitment = amend.CommitmentAmount + } + if amend.ProposedFee.IsPositive() { + p.ProposedFee = amend.ProposedFee + } + oldParams := p.Parameters.Clone() + p.Parameters.ApplyUpdate(amend.Parameters) + p.setCurves(rf, sf, linearSlippage) + return oldParams +} + +// emptyCurve creates the curve details that represent no liquidity. +func emptyCurve( + base *num.Uint, +) *curve { + return &curve{ + l: num.UintZero(), + rf: num.DecimalZero(), + low: base.Clone(), + high: base.Clone(), + empty: true, + } +} + +// generateCurve creates the curve details and calculates its virtual liquidity. +func generateCurve( + sqrt sqrtFn, + commitment, + low, high *num.Uint, + p *num.Uint, + riskFactor, + marginFactor, + linearSlippage num.Decimal, + marginRatio *num.Decimal, + positionFactor num.Decimal, +) *curve { + // rf = 1 / ( mf * ( risk-factor + slippage ) ) + rf := num.DecimalOne().Div(marginFactor.Mul(riskFactor.Add(linearSlippage))) + if marginRatio != nil { + // rf = min(rf, 1/margin-ratio) + rf = num.MinD(rf, num.DecimalOne().Div(*marginRatio)) + } + + // we scale rf by the position factor since that is used to calculate the theoretical volume (pv) at the boundary + // just here below, and also when calculating the fair price when the pool is in a short position. + rf = rf.Mul(positionFactor) + + // calculate the theoretical volume at the extreme i.e upper-bound for high curve, lower bound for low curve + // pv = rf * commitment / p + pv := rf.Mul(commitment.ToDecimal()).Div(p.ToDecimal()) + + // pv * sqrt(high) * sqrt(low) + term1 := pv.Mul(sqrt(high).Mul(sqrt(low))) + + // sqrt(high) - sqrt(low) + term2 := sqrt(high).Sub(sqrt(low)) + + // L = pv * sqrt(high) * sqrt(low) / ( sqrt(high) - sqrt(low) ) + l := term1.Div(term2) + ld, _ := num.UintFromDecimal(l) + return &curve{ + l: ld, + rf: rf, + low: low, + high: high, + } +} + +func (p *Pool) setCurves( + rfs *types.RiskFactor, + sfs *types.ScalingFactors, + linearSlippage num.Decimal, +) { + // convert the bounds into asset precision + base, _ := num.UintFromDecimal(p.Parameters.Base.ToDecimal().Mul(p.priceFactor)) + p.lower = emptyCurve(base) + p.upper = emptyCurve(base) + + if p.Parameters.LowerBound != nil { + lowerBound, _ := num.UintFromDecimal(p.Parameters.LowerBound.ToDecimal().Mul(p.priceFactor)) + p.lower = generateCurve( + p.sqrt, + p.Commitment.Clone(), + lowerBound, + base, + lowerBound, + rfs.Long, + sfs.InitialMargin, + linearSlippage, + p.Parameters.MarginRatioAtLowerBound, + p.positionFactor, + ) + } + + if p.Parameters.UpperBound != nil { + upperBound, _ := num.UintFromDecimal(p.Parameters.UpperBound.ToDecimal().Mul(p.priceFactor)) + p.upper = generateCurve( + p.sqrt, + p.Commitment.Clone(), + base.Clone(), + upperBound, + upperBound, + rfs.Short, + sfs.InitialMargin, + linearSlippage, + p.Parameters.MarginRatioAtUpperBound, + p.positionFactor, + ) + } +} + +// impliedPosition returns the position of the pool if its fair-price were the given price. `l` is +// the virtual liquidity of the pool, and `sqrtPrice` and `sqrtHigh` are, the square-roots of the +// price to calculate the position for, and higher boundary of the curve. +func impliedPosition(sqrtPrice, sqrtHigh num.Decimal, l *num.Uint) *num.Uint { + // L * (sqrt(high) - sqrt(price)) + numer := sqrtHigh.Sub(sqrtPrice).Mul(l.ToDecimal()) + + // sqrt(high) * sqrt(price) + denom := sqrtHigh.Mul(sqrtPrice) + + // L * (sqrt(high) - sqrt(price)) / sqrt(high) * sqrt(price) + res, _ := num.UintFromDecimal(numer.Div(denom)) + return res +} + +// OrderbookShape returns slices of virtual buy and sell orders that the AMM has over a given range +// and is essentially a view on the AMM's personal order-book. +func (p *Pool) OrderbookShape(from, to *num.Uint) ([]*types.Order, []*types.Order) { + buys := []*types.Order{} + sells := []*types.Order{} + + if from == nil { + from = p.lower.low + } + if to == nil { + to = p.upper.high + } + + // any volume strictly below the fair price will be a buy, and volume above will be a sell + side := types.SideBuy + fairPrice := p.fairPrice() + + ordersFromCurve := func(cu *curve, from, to *num.Uint) { + from = num.Max(from, cu.low) + to = num.Min(to, cu.high) + price := from + for price.LT(to) { + next := num.UintZero().AddSum(price, p.oneTick) + + volume := cu.volumeBetweenPrices(p.sqrt, price, next) + if side == types.SideBuy && next.GT(fairPrice) { + // now switch to sells, we're over the fair-price now + side = types.SideSell + } + + order := &types.Order{ + Size: volume, + Side: side, + Price: price.Clone(), + } + + if side == types.SideBuy { + buys = append(buys, order) + } else { + sells = append(sells, order) + } + + price = next + } + } + ordersFromCurve(p.lower, from, to) + ordersFromCurve(p.upper, from, to) + return buys, sells +} + +// TradableVolumeInRange returns the volume the pool is willing to provide between the two given price levels for side of a given order +// that is trading with the pool. If `nil` is provided for either price then we take the full volume in that direction. +func (p *Pool) TradableVolumeInRange(side types.Side, price1 *num.Uint, price2 *num.Uint) uint64 { + if !p.canTrade(side) { + return 0 + } + pos, _ := p.getPosition() + st, nd := price1, price2 + + if price1 == nil { + st = p.lower.low + } + + if price2 == nil { + nd = p.upper.high + } + + if st.EQ(nd) { + return 0 + } + + if st.GT(nd) { + st, nd = nd, st + } + + var other *curve + var volume uint64 + // get the curve based on the pool's current position, if the position is zero we take the curve the trade will put us in + // e.g trading with an incoming buy order will make the pool short, so we take the upper curve. + if pos < 0 || (pos == 0 && side == types.SideBuy) { + volume = p.upper.volumeBetweenPrices(p.sqrt, st, nd) + other = p.lower + } else { + volume = p.lower.volumeBetweenPrices(p.sqrt, st, nd) + other = p.upper + } + + if p.closing() { + return num.MinV(volume, uint64(num.AbsV(pos))) + } + + // if the position is non-zero, the incoming order could push us across to the other curve + // so we need to check for volume there too + if pos != 0 { + volume += other.volumeBetweenPrices(p.sqrt, st, nd) + } + return volume +} + +// getBalance returns the total balance of the pool i.e it's general account + it's margin account. +func (p *Pool) getBalance() *num.Uint { + general, err := p.collateral.GetPartyGeneralAccount(p.SubAccount, p.asset) + if err != nil { + panic("general account not created") + } + + margin, err := p.collateral.GetPartyMarginAccount(p.market, p.SubAccount, p.asset) + if err != nil { + panic("margin account not created") + } + + return num.UintZero().AddSum(general.Balance, margin.Balance) +} + +// setEphemeralPosition is called when we are starting the matching process against this pool +// so that we can track its position and average-entry as it goes through the matching process. +func (p *Pool) setEphemeralPosition() { + if p.eph != nil { + return + } + p.eph = &ephemeralPosition{ + size: 0, + averageEntry: num.UintZero(), + } + + if pos := p.position.GetPositionsByParty(p.SubAccount); len(pos) != 0 { + p.eph.size = pos[0].Size() + p.eph.averageEntry = pos[0].AverageEntryPrice() + } +} + +// updateEphemeralPosition sets the pools transient position given a generated order. +func (p *Pool) updateEphemeralPosition(order *types.Order) { + if order.Side == types.SideSell { + p.eph.averageEntry = positions.CalcVWAP(p.eph.averageEntry, -p.eph.size, int64(order.Size), order.Price) + p.eph.size -= int64(order.Size) + return + } + + p.eph.averageEntry = positions.CalcVWAP(p.eph.averageEntry, p.eph.size, int64(order.Size), order.Price) + p.eph.size += int64(order.Size) +} + +// clearEphemeralPosition signifies that the matching process has finished +// and the pool can continue to read it's position from the positions engine. +func (p *Pool) clearEphemeralPosition() { + p.eph = nil +} + +// getPosition gets the pools current position an average-entry price. +func (p *Pool) getPosition() (int64, *num.Uint) { + if p.eph != nil { + return p.eph.size, p.eph.averageEntry.Clone() + } + + if pos := p.position.GetPositionsByParty(p.SubAccount); len(pos) != 0 { + return pos[0].Size(), pos[0].AverageEntryPrice() + } + return 0, num.UintZero() +} + +// virtualBalancesShort returns the pools x, y balances when the pool has a negative position, where +// +// x = P + (cc * rf) / sqrt(pl) + L / sqrt(pl), +// y = abs(P) * average-entry + L * sqrt(pl). +func (p *Pool) virtualBalancesShort(pos int64, ae *num.Uint) (num.Decimal, num.Decimal) { + cu := p.upper + if cu.empty { + panic("should not be calculating balances on empty-curve side") + } + + balance := p.getBalance() + + // lets start with x + + // P + term1x := num.DecimalFromInt64(-pos) + + // cc * rf / pu + term2x := cu.rf.Mul(num.DecimalFromUint(balance)).Div(num.DecimalFromUint(cu.high)) + + // L / sqrt(pl) + term3x := cu.l.ToDecimal().Div(p.sqrt(cu.high)) + + // x = P + (cc * rf / pu) + (L / sqrt(pl)) + x := term2x.Add(term3x).Sub(term1x) + + // now lets get y + + // abs(P) * average-entry + term1y := ae.Mul(ae, num.NewUint(uint64(-pos))) + + // L * sqrt(pl) + term2y := cu.l.ToDecimal().Mul(p.sqrt(cu.low)) + + // y = abs(P) * average-entry + L * pl + y := term1y.ToDecimal().Add(term2y) + return x, y +} + +// virtualBalancesLong returns the pools x, y balances when the pool has a positive position, where +// +// x = P + (L / sqrt(pu)), +// y = L * (sqrt(pu) - sqrt(pl)) - P * average-entry + (L * sqrt(pl)). +func (p *Pool) virtualBalancesLong(pos int64, ae *num.Uint) (num.Decimal, num.Decimal) { + cu := p.lower + if cu.empty { + panic("should not be calculating balances on empty-curve side") + } + + // lets start with x + + // P + term1x := num.DecimalFromInt64(pos) + + // L / sqrt(pu) + term2x := cu.l.ToDecimal().Div(p.sqrt(cu.high)) + x := term1x.Add(term2x) + + // now lets move to y + + // L * (sqrt(pu) - sqrt(pl)) + (L * sqrt(pl)) => L * sqrt(pu) + term1y := cu.l.ToDecimal().Mul(p.sqrt(cu.high)) + + // P * average-entry + term2y := ae.Mul(ae, num.NewUint(uint64(pos))) + + y := term1y.Sub(term2y.ToDecimal()) + return x, y +} + +// fairPrice returns the fair price of the pool given its current position. +func (p *Pool) fairPrice() *num.Uint { + pos, ae := p.getPosition() + if pos == 0 { + return p.lower.high.Clone() + } + + x, y := p.virtualBalances(pos, ae, types.SideUnspecified) + + // we want to round such that the price is further away from the base. This is so that once + // a pool's position is at its boundary we do not report volume that doesn't exist. For example + // say a pool's upper boundary is 1000 and for it to be at that boundary its position needs to + // be 10.5. The closest we can get is 10 but then we'd report a fair-price of 999.78. If + // we use 999 we'd be implying volume between 999 and 1000 which we don't want to trade. + fp := y.Div(x) + if pos < 0 { + fp = fp.Ceil() + } + + fairPrice, _ := num.UintFromDecimal(fp) + return fairPrice +} + +// virtualBalances returns the pools x, y values where x is the balance in contracts and y is the balance in asset. +func (p *Pool) virtualBalances(pos int64, ae *num.Uint, side types.Side) (num.Decimal, num.Decimal) { + switch { + case pos < 0, pos == 0 && side == types.SideBuy: + // zero position but incoming is buy which will make pool short + return p.virtualBalancesShort(pos, ae) + case pos > 0, pos == 0 && side == types.SideSell: + // zero position but incoming is sell which will make pool long + return p.virtualBalancesLong(pos, ae) + default: + panic("should not reach here") + } +} + +// BestPrice returns the price that the pool is willing to trade for the given order side. +func (p *Pool) BestPrice(order *types.Order) *num.Uint { + fairPrice := p.fairPrice() + switch { + case order == nil: + // special case where we've been asked for a fair price + return fairPrice + case order.Side == types.SideBuy: + // incoming is a buy, so we +1 to the fair price + return fairPrice.AddSum(p.oneTick) + case order.Side == types.SideSell: + // incoming is a sell so we - 1 the fair price + return fairPrice.Sub(fairPrice, p.oneTick) + default: + panic("should never reach here") + } +} + +func (p *Pool) LiquidityFee() num.Decimal { + return p.ProposedFee +} + +func (p *Pool) CommitmentAmount() *num.Uint { + return p.Commitment.Clone() +} + +func (p *Pool) closing() bool { + return p.status == types.AMMPoolStatusReduceOnly +} + +func (p *Pool) canTrade(side types.Side) bool { + if !p.closing() { + return true + } + + pos, _ := p.getPosition() + // pool is long incoming order is a buy and will make it shorter, its ok + if pos > 0 && side == types.SideBuy { + return true + } + if pos < 0 && side == types.SideSell { + return true + } + return false +} diff --git a/core/execution/amm/pool_test.go b/core/execution/amm/pool_test.go new file mode 100644 index 00000000000..7de45e7d3d4 --- /dev/null +++ b/core/execution/amm/pool_test.go @@ -0,0 +1,401 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package amm + +import ( + "testing" + + "code.vegaprotocol.io/vega/core/events" + "code.vegaprotocol.io/vega/core/execution/amm/mocks" + "code.vegaprotocol.io/vega/core/types" + vgcrypto "code.vegaprotocol.io/vega/libs/crypto" + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/libs/ptr" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" +) + +func TestAMMPool(t *testing.T) { + t.Run("test volume between prices", testTradeableVolumeInRange) + t.Run("test trade price", testTradePrice) + t.Run("test pool logic with position factor", testPoolPositionFactor) +} + +func testTradeableVolumeInRange(t *testing.T) { + p := newTestPool(t) + defer p.ctrl.Finish() + + tests := []struct { + name string + price1 *num.Uint + price2 *num.Uint + position int64 + side types.Side + expectedVolume uint64 + }{ + { + name: "full volume upper curve", + price1: num.NewUint(2000), + price2: num.NewUint(2200), + side: types.SideBuy, + expectedVolume: 1818, + }, + { + name: "full volume upper curve with bound creep", + price1: num.NewUint(1500), + price2: num.NewUint(3500), + side: types.SideBuy, + expectedVolume: 1818, + }, + { + name: "full volume lower curve", + price1: num.NewUint(1800), + price2: num.NewUint(2000), + side: types.SideSell, + expectedVolume: 2222, + }, + { + name: "full volume lower curve with bound creep", + price1: num.NewUint(500), + price2: num.NewUint(2500), + side: types.SideSell, + expectedVolume: 2222, + }, + { + name: "trade causes sign to flip and volume crosses curves", + price1: num.NewUint(500), + price2: num.NewUint(3500), + side: types.SideSell, + expectedVolume: 4040, + position: 10, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ensurePosition(t, p.pos, tt.position, num.UintZero()) + volume := p.pool.TradableVolumeInRange(tt.side, tt.price1, tt.price2) + assert.Equal(t, int(tt.expectedVolume), int(volume)) + }) + } +} + +func testPoolPositionFactor(t *testing.T) { + p := newTestPoolWithPositionFactor(t, num.DecimalFromInt64(1000)) + defer p.ctrl.Finish() + + ensurePosition(t, p.pos, 0, num.UintZero()) + volume := p.pool.TradableVolumeInRange(types.SideBuy, num.NewUint(2000), num.NewUint(2200)) + assert.Equal(t, int(1818181), int(volume)) + + ensurePosition(t, p.pos, 0, num.UintZero()) + volume = p.pool.TradableVolumeInRange(types.SideSell, num.NewUint(1800), num.NewUint(2000)) + assert.Equal(t, int(2222222), int(volume)) + + ensurePosition(t, p.pos, -1, num.NewUint(2000)) + ensureBalances(t, p.col, 1000000) + + // now best price should be the same as if the factor were 1, since its a price and not a volume + fairPrice := p.pool.BestPrice(nil) + assert.Equal(t, "1410", fairPrice.String()) +} + +func testTradePrice(t *testing.T) { + p := newTestPool(t) + defer p.ctrl.Finish() + + tests := []struct { + name string + position int64 + balance uint64 + averageEntryPrice *num.Uint + expectedPrice string + order *types.Order + }{ + { + name: "fair price is base price when position is zero", + expectedPrice: "2000", + averageEntryPrice: num.UintZero(), + }, + { + name: "fair price positive position", + expectedPrice: "1999", + position: 1, + balance: 1000000, + averageEntryPrice: num.NewUint(2000), + }, + { + name: "fair price negative position", + expectedPrice: "1410", + position: -1, + balance: 1000000, + averageEntryPrice: num.NewUint(2000), + }, + { + name: "trade price incoming buy", + expectedPrice: "2000", + position: 1, + balance: 1000000, + averageEntryPrice: num.NewUint(2000), + order: &types.Order{ + Side: types.SideBuy, + Size: 1, + }, + }, + { + name: "trade price incoming buy", + expectedPrice: "1998", + position: 1, + balance: 1000000, + averageEntryPrice: num.NewUint(2000), + order: &types.Order{ + Side: types.SideSell, + Size: 1, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + order := tt.order + ensurePosition(t, p.pos, tt.position, tt.averageEntryPrice) + + if tt.position < 0 { + ensureBalances(t, p.col, tt.balance) + } + fairPrice := p.pool.BestPrice(order) + assert.Equal(t, tt.expectedPrice, fairPrice.String()) + }) + } +} + +func TestOneSidedCurve(t *testing.T) { + // a pool with no liquidity below + p := newTestPoolWithRanges(t, nil, num.NewUint(2000), num.NewUint(2200)) + defer p.ctrl.Finish() + + // side with liquidity returns volume + ensurePosition(t, p.pos, 0, num.UintZero()) + volume := p.pool.TradableVolumeInRange(types.SideBuy, num.NewUint(2000), num.NewUint(2200)) + assert.Equal(t, int(1818), int(volume)) + + // empty side returns no volume + ensurePosition(t, p.pos, 0, num.UintZero()) + volume = p.pool.TradableVolumeInRange(types.SideSell, num.NewUint(1800), num.NewUint(2000)) + assert.Equal(t, int(0), int(volume)) + + // pool with short position and incoming sell only reports volume up to base + // empty side returns no volume + ensurePosition(t, p.pos, -10, num.UintZero()) + volume = p.pool.TradableVolumeInRange(types.SideSell, num.NewUint(1800), num.NewUint(2200)) + assert.Equal(t, int(1818), int(volume)) + + // fair price at 0 position is still ok + ensurePosition(t, p.pos, 0, num.UintZero()) + price := p.pool.BestPrice(nil) + assert.Equal(t, price.String(), "2000") + + // fair price at short position is still ok + ensurePosition(t, p.pos, -10, num.UintZero()) + ensureBalances(t, p.col, 1000000) + price = p.pool.BestPrice(nil) + assert.Equal(t, price.String(), "1410") + + // fair price when long should panic since AMM should never be able to get into that state + // fair price at short position is still ok + ensurePosition(t, p.pos, 10, num.UintZero()) + assert.Panics(t, func() { p.pool.BestPrice(nil) }) +} + +func ensurePositionN(t *testing.T, p *mocks.MockPosition, pos int64, averageEntry *num.Uint, times int) { + t.Helper() + + if times < 0 { + p.EXPECT().GetPositionsByParty(gomock.Any()).AnyTimes().Return( + []events.MarketPosition{&marketPosition{size: pos, averageEntry: averageEntry}}, + ) + } else { + p.EXPECT().GetPositionsByParty(gomock.Any()).Times(times).Return( + []events.MarketPosition{&marketPosition{size: pos, averageEntry: averageEntry}}, + ) + } +} + +func ensurePosition(t *testing.T, p *mocks.MockPosition, pos int64, averageEntry *num.Uint) { + t.Helper() + + ensurePositionN(t, p, pos, averageEntry, 1) +} + +func ensureBalancesN(t *testing.T, col *mocks.MockCollateral, balance uint64, times int) { + t.Helper() + + // split the balance equally across general and margin + split := balance / 2 + gen := &types.Account{ + Balance: num.NewUint(split), + } + mar := &types.Account{ + Balance: num.NewUint(balance - split), + } + + if times < 0 { + col.EXPECT().GetPartyGeneralAccount(gomock.Any(), gomock.Any()).AnyTimes().Return(gen, nil) + col.EXPECT().GetPartyMarginAccount(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes().Return(mar, nil) + } else { + col.EXPECT().GetPartyGeneralAccount(gomock.Any(), gomock.Any()).Times(times).Return(gen, nil) + col.EXPECT().GetPartyMarginAccount(gomock.Any(), gomock.Any(), gomock.Any()).Times(times).Return(mar, nil) + } +} + +func ensureBalances(t *testing.T, col *mocks.MockCollateral, balance uint64) { + t.Helper() + ensureBalancesN(t, col, balance, 1) +} + +func TestNotebook(t *testing.T) { + // Note that these were verified using Tom's jupyter notebook, so don't go arbitrarily changing the numbers + // without re-verifying! + + p := newTestPool(t) + defer p.ctrl.Finish() + + base := num.NewUint(2000) + low := num.NewUint(1800) + up := num.NewUint(2200) + + pos := int64(0) + + ensurePosition(t, p.pos, pos, num.UintZero()) + volume := p.pool.TradableVolumeInRange(types.SideSell, base, low) + assert.Equal(t, int(2222), int(volume)) + + ensurePosition(t, p.pos, pos, num.UintZero()) + volume = p.pool.TradableVolumeInRange(types.SideBuy, up, base) + assert.Equal(t, int(1818), int(volume)) + + lowmid := num.NewUint(1900) + upmid := num.NewUint(2100) + + ensurePosition(t, p.pos, pos, num.UintZero()) + volume = p.pool.TradableVolumeInRange(types.SideSell, low, lowmid) + assert.Equal(t, int(1155), int(volume)) + + ensurePosition(t, p.pos, pos, num.UintZero()) + volume = p.pool.TradableVolumeInRange(types.SideBuy, upmid, up) + assert.Equal(t, int(876), int(volume)) + + ensurePosition(t, p.pos, -876, upmid.Clone()) + ensureBalances(t, p.col, 100000) + fairPrice := p.pool.BestPrice(nil) + assert.Equal(t, "2095", fairPrice.String()) + + ensurePosition(t, p.pos, 1154, lowmid.Clone()) + fairPrice = p.pool.BestPrice(nil) + assert.Equal(t, "1893", fairPrice.String()) +} + +type tstPool struct { + pool *Pool + col *mocks.MockCollateral + pos *mocks.MockPosition + ctrl *gomock.Controller +} + +func newTestPool(t *testing.T) *tstPool { + t.Helper() + return newTestPoolWithPositionFactor(t, num.DecimalOne()) +} + +func newTestPoolWithRanges(t *testing.T, low, base, high *num.Uint) *tstPool { + t.Helper() + return newTestPoolWithOpts(t, num.DecimalOne(), low, base, high) +} + +func newTestPoolWithPositionFactor(t *testing.T, positionFactor num.Decimal) *tstPool { + t.Helper() + return newTestPoolWithOpts(t, positionFactor, num.NewUint(1800), num.NewUint(2000), num.NewUint(2200)) +} + +func newTestPoolWithOpts(t *testing.T, positionFactor num.Decimal, low, base, high *num.Uint) *tstPool { + t.Helper() + ctrl := gomock.NewController(t) + col := mocks.NewMockCollateral(ctrl) + pos := mocks.NewMockPosition(ctrl) + + sqrter := &Sqrter{cache: map[string]num.Decimal{}} + + submit := &types.SubmitAMM{ + AMMBaseCommand: types.AMMBaseCommand{ + Party: vgcrypto.RandomHash(), + MarketID: vgcrypto.RandomHash(), + SlippageTolerance: num.DecimalFromFloat(0.1), + }, + // 0000000000000 + CommitmentAmount: num.NewUint(100000), + Parameters: &types.ConcentratedLiquidityParameters{ + Base: base, + LowerBound: low, + UpperBound: high, + MarginRatioAtLowerBound: ptr.From(num.DecimalFromFloat(0.02)), + MarginRatioAtUpperBound: ptr.From(num.DecimalFromFloat(0.02)), + }, + } + + pool := NewPool( + vgcrypto.RandomHash(), + vgcrypto.RandomHash(), + vgcrypto.RandomHash(), + submit, + sqrter.sqrt, + col, + pos, + &types.RiskFactor{ + Short: num.DecimalFromFloat(0.02), + Long: num.DecimalFromFloat(0.02), + }, + &types.ScalingFactors{ + InitialMargin: num.DecimalFromFloat(1.25), // this is 1/0.8 which is margin_usage_at_bound_above in the note-book + }, + num.DecimalZero(), + num.DecimalOne(), + positionFactor, + ) + + return &tstPool{ + pool: pool, + col: col, + pos: pos, + ctrl: ctrl, + } +} + +type marketPosition struct { + size int64 + averageEntry *num.Uint +} + +func (m marketPosition) AverageEntryPrice() *num.Uint { return m.averageEntry.Clone() } +func (m marketPosition) Party() string { return "" } +func (m marketPosition) Size() int64 { return m.size } +func (m marketPosition) Buy() int64 { return 0 } +func (m marketPosition) Sell() int64 { return 0 } +func (m marketPosition) Price() *num.Uint { return num.UintZero() } +func (m marketPosition) BuySumProduct() *num.Uint { return num.UintZero() } +func (m marketPosition) SellSumProduct() *num.Uint { return num.UintZero() } +func (m marketPosition) VWBuy() *num.Uint { return num.UintZero() } +func (m marketPosition) VWSell() *num.Uint { return num.UintZero() } diff --git a/core/execution/common/amm_score_stake.go b/core/execution/common/amm_score_stake.go new file mode 100644 index 00000000000..8264ba397ec --- /dev/null +++ b/core/execution/common/amm_score_stake.go @@ -0,0 +1,75 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package common + +import "code.vegaprotocol.io/vega/libs/num" + +type AMMState struct { + stake num.Decimal // stake during epoch + score num.Decimal // running liquidity score + lastTick int64 // last time update, not used currently, but useful when we want to start caching this stuff + ltD num.Decimal // last time update, just in decimal because it saves on pointless conversions between int64 and num.Decimal +} + +func newAMMState(count int64) *AMMState { + // prevent underflow + if count == 0 { + count = 1 + } + return &AMMState{ + stake: num.DecimalZero(), + score: num.DecimalZero(), + lastTick: count - 1, + ltD: num.DecimalZero(), + } +} + +// UpdateTick is equivalent to calls to UpdateStake, UpdateScore, and IncrementTick. +func (a *AMMState) UpdateTick(stake, score num.Decimal) { + tick := a.ltD.Add(num.DecimalOne()) + a.stake = a.ltD.Mul(a.stake).Add(stake).Div(tick) + a.score = a.ltD.Mul(a.score).Add(score).Div(tick) + a.lastTick++ + a.ltD = a.ltD.Add(num.DecimalOne()) +} + +// UpdateStake updates the time-weighted average stake during epoch. +func (a *AMMState) UpdateStake(stake num.Decimal) { + tick := a.ltD.Add(num.DecimalOne()) + // ((current_tick - 1) * old_stake + new_stake)/current_tick + // ((1 * 100) + 100)/ 2 == 100, checks out + a.stake = a.ltD.Mul(a.stake).Add(stake).Div(tick) +} + +// UpdateScore updates the current epoch score. +func (a *AMMState) UpdateScore(score num.Decimal) { + tick := a.ltD.Add(num.DecimalOne()) + // ((current_tick - 1) * old_score + new_score)/current_tick + // (( 2 * 50 ) + 200) / 3 = 100, checks out + a.score = a.ltD.Mul(a.score).Add(score).Div(tick) +} + +// IncrementTick increments the internal tick/time counter. +func (a *AMMState) IncrementTick() { + a.lastTick++ + a.ltD.Add(num.DecimalOne()) +} + +// StartEpoch resets the internal tick counter, ready for the new epoch to start. +func (a *AMMState) StartEpoch() { + a.lastTick = 0 + a.ltD = num.DecimalZero() +} diff --git a/core/execution/common/interfaces.go b/core/execution/common/interfaces.go index 3ab1f1cbe46..85a677e297e 100644 --- a/core/execution/common/interfaces.go +++ b/core/execution/common/interfaces.go @@ -35,6 +35,8 @@ var One = num.UintOne() //go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/core/execution/common TimeService,Assets,StateVarEngine,Collateral,OracleEngine,EpochEngine,AuctionState,LiquidityEngine,EquityLikeShares,MarketLiquidityEngine,Teams,AccountBalanceChecker,Banking +//go:generate go run github.com/golang/mock/mockgen -destination mocks_amm/mocks.go -package mocks_amm code.vegaprotocol.io/vega/core/execution/common AMMPool,AMM + // InitialOrderVersion is set on `Version` field for every new order submission read from the network. const InitialOrderVersion = 1 @@ -187,6 +189,23 @@ type Collateral interface { GetLiquidityFeesBonusDistributionAccount(marketID, asset string) (*types.Account, error) CreatePartyGeneralAccount(ctx context.Context, partyID, asset string) (string, error) GetOrCreateLiquidityFeesBonusDistributionAccount(ctx context.Context, marketID, asset string) (*types.Account, error) + + // amm stuff + SubAccountClosed(ctx context.Context, party, subAccount, asset, market string) ([]*types.LedgerMovement, error) + SubAccountUpdate( + ctx context.Context, + party, subAccount, asset, market string, + transferType types.TransferType, + amount *num.Uint, + ) (*types.LedgerMovement, error) + SubAccountRelease( + ctx context.Context, + party, subAccount, asset, market string, pos events.MarketPosition, + ) ([]*types.LedgerMovement, events.Margin, error) + CreatePartyAMMsSubAccounts( + ctx context.Context, + party, subAccount, asset, market string, + ) (general *types.Account, margin *types.Account, err error) } type OrderReferenceCheck types.Order @@ -252,6 +271,7 @@ type LiquidityEngine interface { OnStakeToCcyVolumeUpdate(stakeToCcyVolume num.Decimal) OnProvidersFeeCalculationTimeStep(time.Duration) IsProbabilityOfTradingInitialised() bool + GetPartyLiquidityScore(orders []*types.Order, bestBid, bestAsk num.Decimal, minP, maxP *num.Uint) num.Decimal LiquidityProviderSLAStats(t time.Time) []*types.LiquidityProviderSLA @@ -292,6 +312,7 @@ type MarketLiquidityEngine interface { ProvisionsPerParty() liquidity.ProvisionsPerParty OnMarketClosed(context.Context, time.Time) CalculateSuppliedStake() *num.Uint + SetELSFeeFraction(d num.Decimal) } type EquityLikeShares interface { @@ -299,6 +320,17 @@ type EquityLikeShares interface { SetPartyStake(id string, newStakeU *num.Uint) } +type AMMPool interface { + OrderbookShape(from, to *num.Uint) ([]*types.Order, []*types.Order) + LiquidityFee() num.Decimal + CommitmentAmount() *num.Uint +} + +type AMM interface { + GetAMMPoolsBySubAccount() map[string]AMMPool + GetAllSubAccounts() []string +} + type CommonMarket interface { GetID() string Hash() []byte @@ -338,6 +370,7 @@ type CommonMarket interface { OnMarketLiquidityV2StakeToCCYVolume(d num.Decimal) OnMarketLiquidityV2BondPenaltyFactorUpdate(d num.Decimal) OnMarketLiquidityV2ProvidersFeeCalculationTimeStep(t time.Duration) + OnMarketLiquidityEquityLikeShareFeeFractionUpdate(d num.Decimal) // liquidity provision CancelLiquidityProvision(context.Context, *types.LiquidityProvisionCancellation, string) error @@ -353,6 +386,10 @@ type CommonMarket interface { CancelStopOrder(context.Context, string, string) error SubmitStopOrdersWithIDGeneratorAndOrderIDs(context.Context, *types.StopOrdersSubmission, string, IDGenerator, *string, *string) (*types.OrderConfirmation, error) + SubmitAMM(context.Context, *types.SubmitAMM, string) error + AmendAMM(context.Context, *types.AmendAMM, string) error + CancelAMM(context.Context, *types.CancelAMM, string) error + PostRestore(context.Context) error } diff --git a/core/execution/common/liquidity_provision.go b/core/execution/common/liquidity_provision.go index da452f3073d..0f1c8170b34 100644 --- a/core/execution/common/liquidity_provision.go +++ b/core/execution/common/liquidity_provision.go @@ -19,6 +19,7 @@ import ( "context" "errors" "fmt" + "sort" "time" "code.vegaprotocol.io/vega/core/events" @@ -28,7 +29,8 @@ import ( "code.vegaprotocol.io/vega/core/types" "code.vegaprotocol.io/vega/libs/num" "code.vegaprotocol.io/vega/logging" - snapshot "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" + + "golang.org/x/exp/maps" ) var ErrCommitmentAmountTooLow = errors.New("commitment amount is too low") @@ -49,6 +51,7 @@ type MarketLiquidity struct { broker Broker orderBook liquidity.OrderBook equityShares EquityLikeShares + amm AMM marketActivityTracker *MarketActivityTracker fee *fee.Engine @@ -63,6 +66,10 @@ type MarketLiquidity struct { minLPStakeQuantumMultiple num.Decimal bondPenaltyFactor num.Decimal + elsFeeFactor num.Decimal + stakeToCcyVolume num.Decimal + ammStats map[string]*AMMState + tick int64 } func NewMarketLiquidity( @@ -79,6 +86,7 @@ func NewMarketLiquidity( asset string, priceFactor num.Decimal, priceRange num.Decimal, + amm AMM, ) *MarketLiquidity { ml := &MarketLiquidity{ log: log, @@ -94,11 +102,17 @@ func NewMarketLiquidity( asset: asset, priceFactor: priceFactor, priceRange: priceRange, + amm: amm, + ammStats: map[string]*AMMState{}, } return ml } +func (m *MarketLiquidity) SetAMM(a AMM) { + m.amm = a +} + func (m *MarketLiquidity) bondUpdate(ctx context.Context, transfer *types.Transfer) (*types.LedgerMovement, error) { switch m.marketType { case SpotMarketType: @@ -117,6 +131,17 @@ func (m *MarketLiquidity) transferFees(ctx context.Context, ft events.FeesTransf } } +func (m *MarketLiquidity) applyAMMStats() { + ids := maps.Keys(m.ammStats) + sort.Strings(ids) + for _, party := range ids { + amm := m.ammStats[party] + stake, _ := num.UintFromDecimal(amm.stake) + m.equityShares.SetPartyStake(party, stake) + amm.StartEpoch() // mark as new epoch having started + } +} + func (m *MarketLiquidity) applyPendingProvisions( ctx context.Context, now time.Time, @@ -288,7 +313,8 @@ func (m *MarketLiquidity) syncPartyCommitmentWithBondAccount( for _, provision := range appliedLiquidityProvisions { // now we can setup our party stake to calculate equities m.equityShares.SetPartyStake(provision.Party, provision.CommitmentAmount.Clone()) - // force update of shares so they are updated for all + // force update of shares so they are updated for all, used to be in the loop, but should be + // fine to just do this once _ = m.equityShares.AllShares() } } @@ -300,6 +326,8 @@ func (m *MarketLiquidity) OnEpochStart( ) { m.liquidityEngine.ResetSLAEpoch(now, markPrice, midPrice, positionFactor) + m.applyAMMStats() + m.tick = 0 // start of a new epoch, we are at tick 0 appliedProvisions := m.applyPendingProvisions(ctx, now, targetStake) m.syncPartyCommitmentWithBondAccount(ctx, appliedProvisions) } @@ -320,6 +348,17 @@ func (m *MarketLiquidity) OnMarketClosed(ctx context.Context, t time.Time) { func (m *MarketLiquidity) calculateAndDistribute(ctx context.Context, t time.Time) { penalties := m.liquidityEngine.CalculateSLAPenalties(t) + + if m.amm != nil { + for _, subAccountID := range maps.Keys(m.amm.GetAMMPoolsBySubAccount()) { + // set penalty to zero for pool sub accounts as they always meet their obligations for SLA + penalties.PenaltiesPerParty[subAccountID] = &liquidity.SlaPenalty{ + Fee: num.DecimalZero(), + Bond: num.DecimalZero(), + } + } + } + m.distributeFeesBonusesAndApplyPenalties(ctx, penalties) } @@ -336,6 +375,10 @@ func (m *MarketLiquidity) OnTick(ctx context.Context, t time.Time) { } m.updateLiquidityScores() + // first tick since the start of the epoch will be 0 + m.updateAMMCommitment(m.tick) + // increment tick + m.tick++ } func (m *MarketLiquidity) EndBlock(markPrice, midPrice *num.Uint, positionFactor num.Decimal) { @@ -872,6 +915,7 @@ func (m *MarketLiquidity) OnEarlyExitPenalty(earlyExitPenalty num.Decimal) { func (m *MarketLiquidity) OnStakeToCcyVolumeUpdate(stakeToCcyVolume num.Decimal) { m.liquidityEngine.OnStakeToCcyVolumeUpdate(stakeToCcyVolume) + m.stakeToCcyVolume = stakeToCcyVolume } func (m *MarketLiquidity) OnProvidersFeeCalculationTimeStep(d time.Duration) { @@ -893,45 +937,3 @@ func (m *MarketLiquidity) ProvisionsPerParty() liquidity.ProvisionsPerParty { func (m *MarketLiquidity) CalculateSuppliedStake() *num.Uint { return m.liquidityEngine.CalculateSuppliedStake() } - -func NewMarketLiquidityFromSnapshot( - log *logging.Logger, - liquidityEngine LiquidityEngine, - collateral Collateral, - broker Broker, - orderBook liquidity.OrderBook, - equityShares EquityLikeShares, - marketActivityTracker *MarketActivityTracker, - fee *fee.Engine, - marketType marketType, - marketID string, - asset string, - priceFactor num.Decimal, - state *snapshot.MarketLiquidity, -) *MarketLiquidity { - priceRange, _ := num.DecimalFromString(state.PriceRange) - - ml := &MarketLiquidity{ - log: log, - liquidityEngine: liquidityEngine, - collateral: collateral, - broker: broker, - orderBook: orderBook, - equityShares: equityShares, - marketActivityTracker: marketActivityTracker, - fee: fee, - marketType: marketType, - marketID: marketID, - asset: asset, - priceFactor: priceFactor, - priceRange: priceRange, - } - - return ml -} - -func (m *MarketLiquidity) GetState() *snapshot.MarketLiquidity { - return &snapshot.MarketLiquidity{ - PriceRange: m.priceRange.String(), - } -} diff --git a/core/execution/common/liquidity_provision_fees.go b/core/execution/common/liquidity_provision_fees.go index 134510d3369..120d12d3ff7 100644 --- a/core/execution/common/liquidity_provision_fees.go +++ b/core/execution/common/liquidity_provision_fees.go @@ -74,16 +74,32 @@ func (m *MarketLiquidity) AllocateFees(ctx context.Context) error { if acc.Balance.IsZero() { return nil } + ammScores := m.getAMMScores() // Get equity like shares per party. sharesPerLp := m.equityShares.AllShares() - if len(sharesPerLp) == 0 { + // get the LP scores + scoresPerLp := m.liquidityEngine.GetAverageLiquidityScores() + if len(sharesPerLp) == 0 && len(ammScores) == 0 && len(scoresPerLp) == 0 { return nil } - - scoresPerLp := m.liquidityEngine.GetAverageLiquidityScores() - // Multiplies each equity like share with corresponding score. + // add either the score and/or the ELS where needed + for id, av := range ammScores { + if _, ok := sharesPerLp[id]; !ok { + sharesPerLp[id] = num.DecimalZero() + } + if v, ok := scoresPerLp[id]; ok { + av = av.Add(v) + } + // add the AMM LP score to the scores map + scoresPerLp[id] = av + } + // a map of all the LP scores, both AMM and LPs, scaled to 1. + scaledScores := m.scaleScores(scoresPerLp) + // Multiplies each equity like share with corresponding score, scaled to 1. updatedShares := m.updateSharesWithLiquidityScores(sharesPerLp, scoresPerLp) + // now combine the above maps, multiply the ELS part with the fee factor, the score-based map by 1 - factor. + updatedShares = m.mergeScores(updatedShares, scaledScores) feeTransfer := m.fee.BuildLiquidityFeeAllocationTransfer(updatedShares, acc) if feeTransfer == nil { @@ -104,6 +120,112 @@ func (m *MarketLiquidity) AllocateFees(ctx context.Context) error { return nil } +func (m *MarketLiquidity) getAMMScores() map[string]num.Decimal { + ammScores := make(map[string]num.Decimal, len(m.ammStats)) + for id, vals := range m.ammStats { + ammScores[id] = vals.score + } + return ammScores +} + +func (m *MarketLiquidity) updateAMMCommitment(count int64) { + if m.amm == nil { + // spot market, amm won't be set + return + } + minP, maxP, err := m.ValidOrdersPriceRange() + if err != nil { + m.log.Debug("get amm scores error", logging.Error(err)) + // no price range -> we cannot determine the AMM scores. + return + } + skipScore := false + bestB, err := m.orderBook.GetBestStaticBidPrice() + if err != nil { + m.log.Debug("could not get best bid", logging.Error(err)) + skipScore = true + } + bestA, err := m.orderBook.GetBestStaticAskPrice() + if err != nil { + m.log.Debug("could not get best ask", logging.Error(err)) + skipScore = true + } + bb, ba := num.DecimalFromUint(bestB), num.DecimalFromUint(bestA) + for amm, pool := range m.amm.GetAMMPoolsBySubAccount() { + buy, sell := pool.OrderbookShape(minP, maxP) + buyTotal, sellTotal := num.UintZero(), num.UintZero() + for _, b := range buy { + size := num.UintFromUint64(b.Size) + buyTotal.AddSum(size.Mul(size, b.Price)) + } + for _, s := range sell { + size := num.UintFromUint64(s.Size) + sellTotal.AddSum(size.Mul(size, s.Price)) + } + value := buyTotal + if sellTotal.LT(buyTotal) { + value = sellTotal + } + // divide the lesser value by the market.liquidity.stakeToCcyVolume to get the equivalent bond + stake := num.DecimalFromUint(value).Div(m.stakeToCcyVolume) + as, ok := m.ammStats[amm] + if !ok { + as = newAMMState(count) + m.ammStats[amm] = as + } + score := as.score + if !skipScore { + score = m.liquidityEngine.GetPartyLiquidityScore(append(buy, sell...), bb, ba, minP, maxP) + } + // set the stake and score + as.UpdateTick(stake, score) + } +} + +func (m *MarketLiquidity) scaleScores(scores map[string]num.Decimal) map[string]num.Decimal { + if len(scores) == 0 { + return scores + } + total := num.DecimalZero() + for _, s := range scores { + total = total.Add(s) + } + for k, v := range scores { + scores[k] = v.Div(total) + } + return scores +} + +func (m *MarketLiquidity) mergeScores(els, scores map[string]num.Decimal) map[string]num.Decimal { + if len(scores) == 0 { + return els + } + if len(els) == 0 { + return scores // this probably never happens + } + // len(scores) because every entry in the ELS map will have a score + // the other way around is not certain. + ret := make(map[string]num.Decimal, len(scores)) + scoreFactor := num.DecimalOne().Sub(m.elsFeeFactor) // if amm is entitled to 0.2 of the fees, then ELS receives 0.8 + for k, v := range els { + if v.IsZero() { + continue // omit zero values + } + ret[k] = v.Mul(m.elsFeeFactor) // the score * ELS map is entitled to the elsFeeFactor of the total fees + } + for k, v := range scores { + rv := v.Mul(scoreFactor) + if ev, ok := ret[k]; ok { + rv = rv.Add(ev) // party has ELS, just add the portion of fees they are entitled to from the second bucket + } + if rv.IsZero() { + continue // again, leave out the zero values + } + ret[k] = rv // add the entry to the map of either the score-based portion, or the sum of ELS and score. + } + return ret +} + func (m *MarketLiquidity) processBondPenalties( ctx context.Context, partyIDs []string, @@ -116,9 +238,12 @@ func (m *MarketLiquidity) processBondPenalties( provision := m.liquidityEngine.LiquidityProvisionByPartyID(partyID) - // bondPenalty x commitmentAmount. - amount := penalty.Bond.Mul(provision.CommitmentAmount.ToDecimal()) - amountUint, _ := num.UintFromDecimal(amount) + amountUint := num.UintZero() + if provision != nil { + // bondPenalty x commitmentAmount. + amount := penalty.Bond.Mul(provision.CommitmentAmount.ToDecimal()) + amountUint, _ = num.UintFromDecimal(amount) + } if amountUint.IsZero() { continue @@ -316,6 +441,10 @@ func (m *MarketLiquidity) distributeFeesBonusesAndApplyPenalties( m.distributePerformanceBonuses(ctx, partyIDs, bonusPerParty) } +func (m *MarketLiquidity) SetELSFeeFraction(d num.Decimal) { + m.elsFeeFactor = d +} + func sortedKeys[K constraints.Ordered, V any](m map[K]V) []K { keys := make([]K, 0, len(m)) for k := range m { diff --git a/core/execution/common/liquidity_provision_snapshot.go b/core/execution/common/liquidity_provision_snapshot.go new file mode 100644 index 00000000000..ae8ef85e5ec --- /dev/null +++ b/core/execution/common/liquidity_provision_snapshot.go @@ -0,0 +1,112 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package common + +import ( + "sort" + + "code.vegaprotocol.io/vega/core/fee" + "code.vegaprotocol.io/vega/core/liquidity/v2" + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/logging" + snapshot "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" +) + +func NewMarketLiquidityFromSnapshot( + log *logging.Logger, + liquidityEngine LiquidityEngine, + collateral Collateral, + broker Broker, + orderBook liquidity.OrderBook, + equityShares EquityLikeShares, + marketActivityTracker *MarketActivityTracker, + fee *fee.Engine, + marketType marketType, + marketID string, + asset string, + priceFactor num.Decimal, + state *snapshot.MarketLiquidity, + amm AMM, +) (*MarketLiquidity, error) { + priceRange, _ := num.DecimalFromString(state.PriceRange) + + ml := &MarketLiquidity{ + log: log, + liquidityEngine: liquidityEngine, + collateral: collateral, + broker: broker, + orderBook: orderBook, + equityShares: equityShares, + marketActivityTracker: marketActivityTracker, + fee: fee, + marketType: marketType, + marketID: marketID, + asset: asset, + priceFactor: priceFactor, + priceRange: priceRange, + amm: amm, + tick: state.Tick, + } + + ml.ammStats = make(map[string]*AMMState, len(state.Amm)) + for _, val := range state.Amm { + stake, err := num.DecimalFromString(val.Stake) + if err != nil { + return nil, err + } + score, err := num.DecimalFromString(val.Score) + if err != nil { + return nil, err + } + ml.ammStats[val.Party] = &AMMState{ + stake: stake, + score: score, + lastTick: val.Tick, + ltD: num.DecimalFromInt64(val.Tick), + } + } + + return ml, nil +} + +func (m *MarketLiquidity) GetState() *snapshot.MarketLiquidity { + state := &snapshot.MarketLiquidity{ + PriceRange: m.priceRange.String(), + Tick: m.tick, + Amm: make([]*snapshot.AMMValues, 0, len(m.ammStats)), + } + for id, vals := range m.ammStats { + v := &snapshot.AMMValues{ + Party: id, + Stake: vals.stake.String(), + Score: vals.score.String(), + Tick: vals.lastTick, + } + state.Amm = append(state.Amm, v) + } + sort.SliceStable(state.Amm, func(i, j int) bool { + return state.Amm[i].Party < state.Amm[j].Party + }) + return state +} + +func (m *MarketLiquidity) SetState(ml *snapshot.MarketLiquidity) error { + if ml == nil { + return nil + } + + return nil +} diff --git a/core/execution/common/liquidity_provision_test.go b/core/execution/common/liquidity_provision_test.go index bc61675845e..779311dfc72 100644 --- a/core/execution/common/liquidity_provision_test.go +++ b/core/execution/common/liquidity_provision_test.go @@ -26,6 +26,7 @@ import ( cmocks "code.vegaprotocol.io/vega/core/collateral/mocks" "code.vegaprotocol.io/vega/core/execution/common" "code.vegaprotocol.io/vega/core/execution/common/mocks" + ammcmocks "code.vegaprotocol.io/vega/core/execution/common/mocks_amm" "code.vegaprotocol.io/vega/core/fee" "code.vegaprotocol.io/vega/core/liquidity/v2" lmocks "code.vegaprotocol.io/vega/core/liquidity/v2/mocks" @@ -53,6 +54,7 @@ type marketLiquidityTest struct { broker *bmocks.MockBroker orderBook *lmocks.MockOrderBook timeService *cmocks.MockTimeService + amm *ammcmocks.MockAMM } func newMarketLiquidity(t *testing.T) *marketLiquidityTest { @@ -83,6 +85,7 @@ func newMarketLiquidity(t *testing.T) *marketLiquidityTest { bc := mocks.NewMockAccountBalanceChecker(ctrl) marketTracker := common.NewMarketActivityTracker(logging.NewTestLogger(), teams, bc, broker) epochEngine.NotifyOnEpoch(marketTracker.OnEpochEvent, marketTracker.OnEpochRestore) + amm := ammcmocks.NewMockAMM(ctrl) marketLiquidity := common.NewMarketLiquidity( log, @@ -98,6 +101,7 @@ func newMarketLiquidity(t *testing.T) *marketLiquidityTest { settlementAsset, num.DecimalOne(), num.NewDecimalFromFloat(0.5), + amm, ) marketLiquidity.OnMinLPStakeQuantumMultiple(num.DecimalOne()) @@ -115,6 +119,7 @@ func newMarketLiquidity(t *testing.T) *marketLiquidityTest { broker: broker, orderBook: orderBook, timeService: timeService, + amm: amm, ctx: context.Background(), } } @@ -145,6 +150,8 @@ func createPartyAndPayLiquidityFee(t *testing.T, amount *num.Uint, testLiquidity func TestLiquidityProvisionsFeeDistribution(t *testing.T) { testLiquidity := newMarketLiquidity(t) + // set fee factor to 1, so fees are not paid out based on score. + testLiquidity.marketLiquidity.SetELSFeeFraction(num.DecimalOne()) weightsPerLP := map[string]num.Decimal{ "lp-1": num.NewDecimalFromFloat(0.008764241896), @@ -179,6 +186,9 @@ func TestLiquidityProvisionsFeeDistribution(t *testing.T) { ctx := context.Background() testLiquidity.broker.EXPECT().Send(gomock.Any()).AnyTimes() + testLiquidity.orderBook.EXPECT().GetBestStaticAskPrice().Return(num.NewUint(100), nil).AnyTimes() + testLiquidity.orderBook.EXPECT().GetBestStaticBidPrice().Return(num.NewUint(100), nil).AnyTimes() + testLiquidity.amm.EXPECT().GetAMMPoolsBySubAccount().Return(map[string]common.AMMPool{}).AnyTimes() testLiquidity.liquidityEngine.EXPECT().UpdatePartyCommitment(gomock.Any(), gomock.Any()).DoAndReturn( func(partyID string, amount *num.Uint) (*types.LiquidityProvision, error) { @@ -280,7 +290,7 @@ func TestLiquidityProvisionsFeeDistribution(t *testing.T) { testLiquidity.equityShares.EXPECT().AllShares().DoAndReturn(func() map[string]num.Decimal { return weightsPerLP - }) + }).AnyTimes() testLiquidity.liquidityEngine.EXPECT().GetAverageLiquidityScores().DoAndReturn(func() map[string]num.Decimal { return scoresPerLP @@ -384,6 +394,266 @@ func TestLiquidityProvisionsFeeDistribution(t *testing.T) { testLiquidity.marketLiquidity.OnEpochStart(testLiquidity.ctx, now, uintOne, uintOne, uintOne, decimalOne) } +func TestLiquidityProvisionsWithPoolsFeeDistribution(t *testing.T) { + testLiquidity := newMarketLiquidity(t) + // set fee factor to 1, so fees are not paid out based on score. + testLiquidity.marketLiquidity.SetELSFeeFraction(num.DecimalOne()) + + weightsPerLP := map[string]num.Decimal{ + "lp-1": num.NewDecimalFromFloat(0.008764241896), + "lp-2": num.NewDecimalFromFloat(0.0008764241895), + "lp-3": num.NewDecimalFromFloat(0.0175284838), + "lp-4": num.NewDecimalFromFloat(0.03505689996), + "lp-5": num.NewDecimalFromFloat(0.061349693), + "lp-6": num.NewDecimalFromFloat(0.2921413963), + "pool-party-1": num.NewDecimalFromFloat(0.2921413963), + "pool-party-2": num.NewDecimalFromFloat(0.2921413963), + } + + expectedAllocatedFess := map[string]num.Uint{ + "lp-1": *num.NewUint(1000), + "lp-2": *num.NewUint(100), + "lp-3": *num.NewUint(2000), + "lp-4": *num.NewUint(4000), + "lp-5": *num.NewUint(7000), + "lp-6": *num.NewUint(33333), + "pool-party-1": *num.NewUint(33333), + "pool-party-2": *num.NewUint(33333), + } + + expectedDistributedFess := map[string]num.Uint{ + "lp-1": *num.NewUint(1527), + "lp-2": *num.NewUint(144), + "lp-3": *num.NewUint(2743), + "lp-4": *num.NewUint(4877), + "lp-5": *num.NewUint(3200), + "lp-6": *num.NewUint(0), + "pool-party-1": *num.NewUint(50804), + "pool-party-2": *num.NewUint(50804), + } + + poolsPartyIDs := []string{"pool-party-1", "pool-party-2"} + keys := append([]string{"lp-1", "lp-2", "lp-3", "lp-4", "lp-5", "lp-6"}, poolsPartyIDs...) + + ctx := context.Background() + + testLiquidity.broker.EXPECT().Send(gomock.Any()).AnyTimes() + + testLiquidity.orderBook.EXPECT().GetBestStaticAskPrice().Return(num.NewUint(100), nil).AnyTimes() + testLiquidity.orderBook.EXPECT().GetBestStaticBidPrice().Return(num.NewUint(100), nil).AnyTimes() + + poolMock := ammcmocks.NewMockAMMPool(testLiquidity.ctrl) + ammPools := map[string]common.AMMPool{ + "pool-party-1": poolMock, + "pool-party-2": poolMock, + } + + testLiquidity.amm.EXPECT().GetAMMPoolsBySubAccount().Return(ammPools).AnyTimes() + + testLiquidity.liquidityEngine.EXPECT().UpdatePartyCommitment(gomock.Any(), gomock.Any()).DoAndReturn( + func(partyID string, amount *num.Uint) (*types.LiquidityProvision, error) { + return &types.LiquidityProvision{ + Party: partyID, + CommitmentAmount: amount.Clone(), + }, nil + }).AnyTimes() + + // enable asset first. + err := testLiquidity.collateralEngine.EnableAsset(ctx, types.Asset{ + ID: testLiquidity.asset, + Details: &types.AssetDetails{ + Name: testLiquidity.asset, + Symbol: testLiquidity.asset, + Decimals: 0, + Source: types.AssetDetailsErc20{ + ERC20: &types.ERC20{ + ContractAddress: "addrs", + }, + }, + }, + }) + assert.NoError(t, err) + + for _, partyID := range poolsPartyIDs { + // create pool party general account. + _, err = testLiquidity.collateralEngine.CreatePartyGeneralAccount(ctx, partyID, testLiquidity.asset) + assert.NoError(t, err) + + // create pool party liquidity fee account. + _, err := testLiquidity.collateralEngine.GetOrCreatePartyLiquidityFeeAccount(ctx, partyID, testLiquidity.marketID, testLiquidity.asset) + assert.NoError(t, err) + } + + // create all required accounts for spot market. + err = testLiquidity.collateralEngine.CreateSpotMarketAccounts(ctx, testLiquidity.marketID, testLiquidity.asset) + assert.NoError(t, err) + + testLiquidity.liquidityEngine.EXPECT(). + SubmitLiquidityProvision(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()). + AnyTimes() + + testLiquidity.liquidityEngine.EXPECT().PendingProvision().Return(nil).AnyTimes() + one := num.UintOne() + testLiquidity.liquidityEngine.EXPECT().CalculateSuppliedStakeWithoutPending().Return(one).AnyTimes() + testLiquidity.liquidityEngine.EXPECT().ApplyPendingProvisions(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + + testLiquidity.timeService.EXPECT().GetTimeNow().DoAndReturn(func() time.Time { + return time.Now() + }).AnyTimes() + + decimalOne := num.DecimalOne() + uintOne := num.UintOne() + commitmentAmount := num.NewUint(10) + scoresPerLP := map[string]num.Decimal{} + provisionsPerParty := map[string]*types.LiquidityProvision{} + + // create liquidity providers accounts and submit provision. + for provider := range weightsPerLP { + // set score to one. + scoresPerLP[provider] = decimalOne + + // create providers general account and deposit funds into it. + _, err := testLiquidity.collateralEngine.CreatePartyGeneralAccount(ctx, provider, testLiquidity.asset) + assert.NoError(t, err) + + _, err = testLiquidity.collateralEngine.Deposit(ctx, provider, testLiquidity.asset, commitmentAmount) + assert.NoError(t, err) + + // submit the provision. + provision := &types.LiquidityProvisionSubmission{ + MarketID: testLiquidity.marketID, + CommitmentAmount: commitmentAmount, + Reference: provider, + } + + deterministicID := hex.EncodeToString(vgcrypto.Hash([]byte(provider))) + err = testLiquidity.marketLiquidity.SubmitLiquidityProvision(ctx, provision, provider, + deterministicID, types.MarketStateActive) + assert.NoError(t, err) + + // setup provision per party. + provisionsPerParty[provider] = &types.LiquidityProvision{ + Party: provider, + CommitmentAmount: provision.CommitmentAmount.Clone(), + } + } + + // create party and make it pay liquidity fee. + createPartyAndPayLiquidityFee(t, num.NewUint(114101), testLiquidity) + + testLiquidity.liquidityEngine.EXPECT().ProvisionsPerParty().DoAndReturn(func() liquidity.ProvisionsPerParty { + return provisionsPerParty + }).AnyTimes() + + testLiquidity.liquidityEngine.EXPECT().ResetSLAEpoch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + + // start epoch. + lastDistributionStep := time.Now() + now := lastDistributionStep.Add(time.Second * 5) + testLiquidity.liquidityEngine.EXPECT().ReadyForFeesAllocation(gomock.Any()).Return(true) + + testLiquidity.marketLiquidity.OnEpochStart(testLiquidity.ctx, now, uintOne, uintOne, uintOne, decimalOne) + + testLiquidity.liquidityEngine.EXPECT().ResetAverageLiquidityScores().AnyTimes() + testLiquidity.liquidityEngine.EXPECT().ResetFeeAllocationPeriod(gomock.Any()).AnyTimes() + + testLiquidity.equityShares.EXPECT().AllShares().DoAndReturn(func() map[string]num.Decimal { + return weightsPerLP + }) + + testLiquidity.liquidityEngine.EXPECT().GetAverageLiquidityScores().DoAndReturn(func() map[string]num.Decimal { + return scoresPerLP + }) + + // trigger a time tick - this should start allocation fees to LP fee accounts. + testLiquidity.marketLiquidity.OnTick(ctx, now) + + for _, provider := range keys { + acc, err := testLiquidity.collateralEngine.GetPartyLiquidityFeeAccount( + testLiquidity.marketID, + provider, + testLiquidity.asset, + ) + assert.NoError(t, err) + + expected := expectedAllocatedFess[provider] + assert.True(t, expected.EQ(acc.Balance), "party %s liquidity fee account balance is %s, expected: %s", provider, acc.Balance, expected) + } + + zeroPointFive := num.NewDecimalFromFloat(0.5) + expectedSLAPenalties := map[string]*liquidity.SlaPenalty{ + "lp-1": { + Fee: num.NewDecimalFromFloat(0), + Bond: zeroPointFive, + }, + "lp-2": { + Fee: num.NewDecimalFromFloat(0.05), + Bond: zeroPointFive, + }, + "lp-3": { + Fee: num.NewDecimalFromFloat(0.1), + Bond: zeroPointFive, + }, + "lp-4": { + Fee: num.NewDecimalFromFloat(0.2), + Bond: zeroPointFive, + }, + "lp-5": { + Fee: num.NewDecimalFromFloat(0.7), + Bond: zeroPointFive, + }, + "lp-6": { + Fee: num.NewDecimalFromFloat(1), + Bond: zeroPointFive, + }, + } + + testLiquidity.liquidityEngine.EXPECT().CalculateSLAPenalties(gomock.Any()).DoAndReturn( + func(_ time.Time) liquidity.SlaPenalties { + return liquidity.SlaPenalties{ + PenaltiesPerParty: expectedSLAPenalties, + } + }, + ) + + testLiquidity.liquidityEngine.EXPECT(). + LiquidityProvisionByPartyID(gomock.Any()). + DoAndReturn(func(party string) *types.LiquidityProvision { + return &types.LiquidityProvision{ + ID: party, + Party: party, + CommitmentAmount: commitmentAmount, + } + }).AnyTimes() + + // end epoch - this should trigger the SLA fees distribution. + testLiquidity.marketLiquidity.OnEpochEnd(testLiquidity.ctx, now, types.Epoch{}) + + for _, provider := range keys { + generalAcc, err := testLiquidity.collateralEngine.GetPartyGeneralAccount( + provider, + testLiquidity.asset, + ) + assert.NoError(t, err) + + expectedFee := expectedDistributedFess[provider] + assert.Truef(t, expectedFee.EQ(generalAcc.Balance), + "party %s general account balance is %s, expected: %s", provider, generalAcc.Balance, expectedFee) + } + + acc, err := testLiquidity.collateralEngine.GetOrCreateLiquidityFeesBonusDistributionAccount( + ctx, + testLiquidity.marketID, + testLiquidity.asset, + ) + assert.NoError(t, err) + assert.True(t, acc.Balance.EQ(num.UintZero())) + + testLiquidity.equityShares.EXPECT().SetPartyStake(gomock.Any(), gomock.Any()).AnyTimes() + testLiquidity.equityShares.EXPECT().AllShares().AnyTimes() + testLiquidity.marketLiquidity.OnEpochStart(testLiquidity.ctx, now, uintOne, uintOne, uintOne, decimalOne) +} + func TestLiquidityProvisionsAmendments(t *testing.T) { testLiquidity := newMarketLiquidity(t) @@ -394,6 +664,7 @@ func TestLiquidityProvisionsAmendments(t *testing.T) { }).AnyTimes() testLiquidity.broker.EXPECT().Send(gomock.Any()).AnyTimes() + testLiquidity.amm.EXPECT().GetAMMPoolsBySubAccount().Return(map[string]common.AMMPool{}).AnyTimes() testLiquidity.liquidityEngine.EXPECT().UpdatePartyCommitment(gomock.Any(), gomock.Any()).DoAndReturn( func(partyID string, amount *num.Uint) (*types.LiquidityProvision, error) { @@ -520,6 +791,8 @@ func TestCancelLiquidityProvisionDuringOpeningAuction(t *testing.T) { testLiquidity.broker.EXPECT().Send(gomock.Any()).AnyTimes() + testLiquidity.amm.EXPECT().GetAMMPoolsBySubAccount().Return(map[string]common.AMMPool{}).AnyTimes() + // enable asset first. err := testLiquidity.collateralEngine.EnableAsset(ctx, types.Asset{ ID: testLiquidity.asset, diff --git a/core/execution/common/market_activity_tracker.go b/core/execution/common/market_activity_tracker.go index 2f9d3295ffb..c7bbee97971 100644 --- a/core/execution/common/market_activity_tracker.go +++ b/core/execution/common/market_activity_tracker.go @@ -94,6 +94,8 @@ type marketTracker struct { proposer string readyToDelete bool allPartiesCache map[string]struct{} + // keys of automated market makers + ammPartiesCache map[string]struct{} } // MarketActivityTracker tracks how much fees are paid and received for a market by parties by epoch. @@ -203,6 +205,7 @@ func (mat *MarketActivityTracker) MarketProposed(asset, marketID, proposer strin epochTimeWeightedPosition: []map[string]uint64{}, epochTimeWeightedNotional: []map[string]*num.Uint{}, allPartiesCache: map[string]struct{}{}, + ammPartiesCache: map[string]struct{}{}, } if ok { @@ -221,6 +224,24 @@ func (mat *MarketActivityTracker) AddValueTraded(asset, marketID string, value * markets[marketID].valueTraded.AddSum(value) } +// AddAMMSubAccount records sub account entries for AMM in given market. +func (mat *MarketActivityTracker) AddAMMSubAccount(asset, marketID, subAccount string) { + markets, ok := mat.assetToMarketTrackers[asset] + if !ok || markets[marketID] == nil { + return + } + markets[marketID].ammPartiesCache[subAccount] = struct{}{} +} + +// RemoveAMMSubAccount removes sub account entries for AMM in given market. +func (mat *MarketActivityTracker) RemoveAMMSubAccount(asset, marketID, subAccount string) { + markets, ok := mat.assetToMarketTrackers[asset] + if !ok || markets[marketID] == nil { + return + } + delete(markets[marketID].ammPartiesCache, subAccount) +} + // GetMarketsWithEligibleProposer gets all the markets within the given asset (or just all the markets in scope passed as a parameter) that // are eligible for proposer bonus. func (mat *MarketActivityTracker) GetMarketsWithEligibleProposer(asset string, markets []string, payoutAsset string, funder string) []*types.MarketContributionScore { @@ -562,7 +583,11 @@ func (mat *MarketActivityTracker) RecordFundingPayment(asset, party, market stri } } -func (mat *MarketActivityTracker) getAllParties(asset string, mkts []string) map[string]struct{} { +func (mat *MarketActivityTracker) filterParties( + asset string, + mkts []string, + cacheFilter func(*marketTracker) map[string]struct{}, +) map[string]struct{} { parties := map[string]struct{}{} includedMarkets := mkts if len(mkts) == 0 { @@ -578,7 +603,7 @@ func (mat *MarketActivityTracker) getAllParties(asset string, mkts []string) map if !ok { continue } - mktParties := mt.allPartiesCache + mktParties := cacheFilter(mt) for k := range mktParties { parties[k] = struct{}{} } @@ -587,6 +612,18 @@ func (mat *MarketActivityTracker) getAllParties(asset string, mkts []string) map return parties } +func (mat *MarketActivityTracker) getAllParties(asset string, mkts []string) map[string]struct{} { + return mat.filterParties(asset, mkts, func(mt *marketTracker) map[string]struct{} { + return mt.allPartiesCache + }) +} + +func (mat *MarketActivityTracker) GetAllAMMParties(asset string, mkts []string) map[string]struct{} { + return mat.filterParties(asset, mkts, func(mt *marketTracker) map[string]struct{} { + return mt.ammPartiesCache + }) +} + func (mat *MarketActivityTracker) getPartiesInScope(ds *vega.DispatchStrategy) []string { var parties []string if ds.IndividualScope == vega.IndividualScope_INDIVIDUAL_SCOPE_IN_TEAM { @@ -595,6 +632,8 @@ func (mat *MarketActivityTracker) getPartiesInScope(ds *vega.DispatchStrategy) [ parties = sortedK(mat.getAllParties(ds.AssetForMetric, ds.Markets)) } else if ds.IndividualScope == vega.IndividualScope_INDIVIDUAL_SCOPE_NOT_IN_TEAM { parties = sortedK(excludePartiesInTeams(mat.getAllParties(ds.AssetForMetric, ds.Markets), mat.teams.GetAllPartiesInTeams(mat.minEpochsInTeamForRewardEligibility))) + } else if ds.IndividualScope == vega.IndividualScope_INDIVIDUAL_SCOPE_AMM { + parties = sortedK(mat.GetAllAMMParties(ds.AssetForMetric, ds.Markets)) } return parties } diff --git a/core/execution/common/market_activity_tracker_snapshot.go b/core/execution/common/market_activity_tracker_snapshot.go index 0674ec96175..38e92fc88f8 100644 --- a/core/execution/common/market_activity_tracker_snapshot.go +++ b/core/execution/common/market_activity_tracker_snapshot.go @@ -28,6 +28,8 @@ import ( "code.vegaprotocol.io/vega/libs/proto" checkpoint "code.vegaprotocol.io/vega/protos/vega/checkpoint/v1" snapshot "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" + + "golang.org/x/exp/maps" ) var ( @@ -282,6 +284,9 @@ func (mt *marketTracker) IntoProto(market string) *checkpoint.MarketActivityTrac } sort.Strings(paid) + ammParties := maps.Keys(mt.ammPartiesCache) + sort.Strings(ammParties) + return &checkpoint.MarketActivityTracker{ Market: market, Asset: mt.asset, @@ -305,6 +310,7 @@ func (mt *marketTracker) IntoProto(market string) *checkpoint.MarketActivityTrac ReturnsDataHistory: epochReturnDataToProto(mt.epochPartyM2M), RealisedReturns: returnsDataToProto(mt.partyRealisedReturn), RealisedReturnsHistory: epochReturnDataToProto(mt.epochPartyRealisedReturn), + AmmParties: ammParties, } } @@ -409,6 +415,11 @@ func marketTrackerFromProto(tracker *checkpoint.MarketActivityTracker) *marketTr epochTimeWeightedPosition: []map[string]uint64{}, epochTimeWeightedNotional: []map[string]*num.Uint{}, allPartiesCache: map[string]struct{}{}, + ammPartiesCache: map[string]struct{}{}, + } + + for _, party := range tracker.AmmParties { + mft.ammPartiesCache[party] = struct{}{} } for _, bpfpa := range tracker.BonusPaid { diff --git a/core/execution/common/market_activity_tracker_test.go b/core/execution/common/market_activity_tracker_test.go index e381412adc2..5e0a8656642 100644 --- a/core/execution/common/market_activity_tracker_test.go +++ b/core/execution/common/market_activity_tracker_test.go @@ -180,6 +180,34 @@ func TestRemoveMarket(t *testing.T) { require.Equal(t, "market2", tracker.GetAllMarketIDs()[0]) } +func TestAddRemoveAMM(t *testing.T) { + epochService := &TestEpochEngine{} + ctrl := gomock.NewController(t) + teams := mocks.NewMockTeams(ctrl) + broker := bmocks.NewMockBroker(ctrl) + balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) + + tracker := common.NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) + epochService.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) + tracker.SetEligibilityChecker(&EligibilityChecker{}) + tracker.MarketProposed("asset1", "market1", "me") + tracker.MarketProposed("asset1", "market2", "me2") + require.Equal(t, 2, len(tracker.GetAllMarketIDs())) + require.Equal(t, "market1", tracker.GetAllMarketIDs()[0]) + require.Equal(t, "market2", tracker.GetAllMarketIDs()[1]) + + tracker.AddAMMSubAccount("asset1", "market1", "sub1") + tracker.AddAMMSubAccount("asset1", "market1", "sub2") + + require.Equal(t, map[string]struct{}{"sub1": {}, "sub2": {}}, tracker.GetAllAMMParties("asset1", nil)) + + tracker.RemoveAMMSubAccount("asset1", "market1", "sub2") + require.Equal(t, map[string]struct{}{"sub1": {}}, tracker.GetAllAMMParties("asset1", nil)) + + tracker.RemoveAMMSubAccount("asset1", "market1", "sub1") + require.Equal(t, map[string]struct{}{}, tracker.GetAllAMMParties("asset1", nil)) +} + func TestGetScores(t *testing.T) { ctx := context.Background() epochService := &TestEpochEngine{} @@ -366,6 +394,8 @@ func TestGetScoresIndividualsDifferentScopes(t *testing.T) { epochService.target(context.Background(), types.Epoch{Seq: 2, Action: vgproto.EpochAction_EPOCH_ACTION_START}) + tracker.AddAMMSubAccount("asset1", "market1", "party1") + // update with a few transfers transfersM1 := []*types.Transfer{ {Owner: "party1", Type: types.TransferTypeMakerFeeReceive, Amount: &types.FinancialAmount{Asset: "asset1", Amount: num.NewUint(100)}}, @@ -412,6 +442,17 @@ func TestGetScoresIndividualsDifferentScopes(t *testing.T) { require.Equal(t, "party2", scores[1].Party) require.Equal(t, "0.8", scores[1].Score.String()) + // looking across all markets in asset 1 with window length 1 and AMM scope: + // party1: 800 + // partt2: 3200 + // total = 4000 + // party1 = 800/4000 = 0.2 + scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "asset1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_LP_FEES_RECEIVED, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_AMM, WindowLength: 1}) + require.Equal(t, 1, len(scores)) + + require.Equal(t, "party1", scores[0].Party) + require.Equal(t, "0.2", scores[0].Score.String()) + // now look only on market 1: // party1 = 800/2500 = 0.32 // partt2 = 1700/2500 = 0.68 diff --git a/core/execution/common/mocks/mocks.go b/core/execution/common/mocks/mocks.go index 73d0643ac39..b4be86a62c5 100644 --- a/core/execution/common/mocks/mocks.go +++ b/core/execution/common/mocks/mocks.go @@ -342,6 +342,22 @@ func (mr *MockCollateralMockRecorder) CreateMarketAccounts(arg0, arg1, arg2 inte return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateMarketAccounts", reflect.TypeOf((*MockCollateral)(nil).CreateMarketAccounts), arg0, arg1, arg2) } +// CreatePartyAMMsSubAccounts mocks base method. +func (m *MockCollateral) CreatePartyAMMsSubAccounts(arg0 context.Context, arg1, arg2, arg3, arg4 string) (*types.Account, *types.Account, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreatePartyAMMsSubAccounts", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(*types.Account) + ret1, _ := ret[1].(*types.Account) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// CreatePartyAMMsSubAccounts indicates an expected call of CreatePartyAMMsSubAccounts. +func (mr *MockCollateralMockRecorder) CreatePartyAMMsSubAccounts(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreatePartyAMMsSubAccounts", reflect.TypeOf((*MockCollateral)(nil).CreatePartyAMMsSubAccounts), arg0, arg1, arg2, arg3, arg4) +} + // CreatePartyGeneralAccount mocks base method. func (m *MockCollateral) CreatePartyGeneralAccount(arg0 context.Context, arg1, arg2 string) (string, error) { m.ctrl.T.Helper() @@ -819,6 +835,52 @@ func (mr *MockCollateralMockRecorder) RollbackMarginUpdateOnOrder(arg0, arg1, ar return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RollbackMarginUpdateOnOrder", reflect.TypeOf((*MockCollateral)(nil).RollbackMarginUpdateOnOrder), arg0, arg1, arg2, arg3) } +// SubAccountClosed mocks base method. +func (m *MockCollateral) SubAccountClosed(arg0 context.Context, arg1, arg2, arg3, arg4 string) ([]*types.LedgerMovement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SubAccountClosed", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].([]*types.LedgerMovement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SubAccountClosed indicates an expected call of SubAccountClosed. +func (mr *MockCollateralMockRecorder) SubAccountClosed(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubAccountClosed", reflect.TypeOf((*MockCollateral)(nil).SubAccountClosed), arg0, arg1, arg2, arg3, arg4) +} + +// SubAccountRelease mocks base method. +func (m *MockCollateral) SubAccountRelease(arg0 context.Context, arg1, arg2, arg3, arg4 string, arg5 events.MarketPosition) ([]*types.LedgerMovement, events.Margin, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SubAccountRelease", arg0, arg1, arg2, arg3, arg4, arg5) + ret0, _ := ret[0].([]*types.LedgerMovement) + ret1, _ := ret[1].(events.Margin) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// SubAccountRelease indicates an expected call of SubAccountRelease. +func (mr *MockCollateralMockRecorder) SubAccountRelease(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubAccountRelease", reflect.TypeOf((*MockCollateral)(nil).SubAccountRelease), arg0, arg1, arg2, arg3, arg4, arg5) +} + +// SubAccountUpdate mocks base method. +func (m *MockCollateral) SubAccountUpdate(arg0 context.Context, arg1, arg2, arg3, arg4 string, arg5 vega.TransferType, arg6 *num.Uint) (*types.LedgerMovement, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SubAccountUpdate", arg0, arg1, arg2, arg3, arg4, arg5, arg6) + ret0, _ := ret[0].(*types.LedgerMovement) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SubAccountUpdate indicates an expected call of SubAccountUpdate. +func (mr *MockCollateralMockRecorder) SubAccountUpdate(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubAccountUpdate", reflect.TypeOf((*MockCollateral)(nil).SubAccountUpdate), arg0, arg1, arg2, arg3, arg4, arg5, arg6) +} + // SuccessorInsuranceFraction mocks base method. func (m *MockCollateral) SuccessorInsuranceFraction(arg0 context.Context, arg1, arg2, arg3 string, arg4 decimal.Decimal) *types.LedgerMovement { m.ctrl.T.Helper() @@ -1599,6 +1661,20 @@ func (mr *MockLiquidityEngineMockRecorder) GetLegacyOrders() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLegacyOrders", reflect.TypeOf((*MockLiquidityEngine)(nil).GetLegacyOrders)) } +// GetPartyLiquidityScore mocks base method. +func (m *MockLiquidityEngine) GetPartyLiquidityScore(arg0 []*types.Order, arg1, arg2 decimal.Decimal, arg3, arg4 *num.Uint) decimal.Decimal { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetPartyLiquidityScore", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(decimal.Decimal) + return ret0 +} + +// GetPartyLiquidityScore indicates an expected call of GetPartyLiquidityScore. +func (mr *MockLiquidityEngineMockRecorder) GetPartyLiquidityScore(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPartyLiquidityScore", reflect.TypeOf((*MockLiquidityEngine)(nil).GetPartyLiquidityScore), arg0, arg1, arg2, arg3, arg4) +} + // IsLiquidityProvider mocks base method. func (m *MockLiquidityEngine) IsLiquidityProvider(arg0 string) bool { m.ctrl.T.Helper() @@ -2353,6 +2429,18 @@ func (mr *MockMarketLiquidityEngineMockRecorder) ProvisionsPerParty() *gomock.Ca return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ProvisionsPerParty", reflect.TypeOf((*MockMarketLiquidityEngine)(nil).ProvisionsPerParty)) } +// SetELSFeeFraction mocks base method. +func (m *MockMarketLiquidityEngine) SetELSFeeFraction(arg0 decimal.Decimal) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetELSFeeFraction", arg0) +} + +// SetELSFeeFraction indicates an expected call of SetELSFeeFraction. +func (mr *MockMarketLiquidityEngineMockRecorder) SetELSFeeFraction(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetELSFeeFraction", reflect.TypeOf((*MockMarketLiquidityEngine)(nil).SetELSFeeFraction), arg0) +} + // StopAllLiquidityProvision mocks base method. func (m *MockMarketLiquidityEngine) StopAllLiquidityProvision(arg0 context.Context) { m.ctrl.T.Helper() diff --git a/core/execution/common/mocks_amm/mocks.go b/core/execution/common/mocks_amm/mocks.go new file mode 100644 index 00000000000..a846fbd9965 --- /dev/null +++ b/core/execution/common/mocks_amm/mocks.go @@ -0,0 +1,132 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: code.vegaprotocol.io/vega/core/execution/common (interfaces: AMMPool,AMM) + +// Package mocks_amm is a generated GoMock package. +package mocks_amm + +import ( + reflect "reflect" + + common "code.vegaprotocol.io/vega/core/execution/common" + types "code.vegaprotocol.io/vega/core/types" + num "code.vegaprotocol.io/vega/libs/num" + gomock "github.com/golang/mock/gomock" + decimal "github.com/shopspring/decimal" +) + +// MockAMMPool is a mock of AMMPool interface. +type MockAMMPool struct { + ctrl *gomock.Controller + recorder *MockAMMPoolMockRecorder +} + +// MockAMMPoolMockRecorder is the mock recorder for MockAMMPool. +type MockAMMPoolMockRecorder struct { + mock *MockAMMPool +} + +// NewMockAMMPool creates a new mock instance. +func NewMockAMMPool(ctrl *gomock.Controller) *MockAMMPool { + mock := &MockAMMPool{ctrl: ctrl} + mock.recorder = &MockAMMPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAMMPool) EXPECT() *MockAMMPoolMockRecorder { + return m.recorder +} + +// CommitmentAmount mocks base method. +func (m *MockAMMPool) CommitmentAmount() *num.Uint { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CommitmentAmount") + ret0, _ := ret[0].(*num.Uint) + return ret0 +} + +// CommitmentAmount indicates an expected call of CommitmentAmount. +func (mr *MockAMMPoolMockRecorder) CommitmentAmount() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CommitmentAmount", reflect.TypeOf((*MockAMMPool)(nil).CommitmentAmount)) +} + +// LiquidityFee mocks base method. +func (m *MockAMMPool) LiquidityFee() decimal.Decimal { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LiquidityFee") + ret0, _ := ret[0].(decimal.Decimal) + return ret0 +} + +// LiquidityFee indicates an expected call of LiquidityFee. +func (mr *MockAMMPoolMockRecorder) LiquidityFee() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LiquidityFee", reflect.TypeOf((*MockAMMPool)(nil).LiquidityFee)) +} + +// OrderbookShape mocks base method. +func (m *MockAMMPool) OrderbookShape(arg0, arg1 *num.Uint) ([]*types.Order, []*types.Order) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OrderbookShape", arg0, arg1) + ret0, _ := ret[0].([]*types.Order) + ret1, _ := ret[1].([]*types.Order) + return ret0, ret1 +} + +// OrderbookShape indicates an expected call of OrderbookShape. +func (mr *MockAMMPoolMockRecorder) OrderbookShape(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OrderbookShape", reflect.TypeOf((*MockAMMPool)(nil).OrderbookShape), arg0, arg1) +} + +// MockAMM is a mock of AMM interface. +type MockAMM struct { + ctrl *gomock.Controller + recorder *MockAMMMockRecorder +} + +// MockAMMMockRecorder is the mock recorder for MockAMM. +type MockAMMMockRecorder struct { + mock *MockAMM +} + +// NewMockAMM creates a new mock instance. +func NewMockAMM(ctrl *gomock.Controller) *MockAMM { + mock := &MockAMM{ctrl: ctrl} + mock.recorder = &MockAMMMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAMM) EXPECT() *MockAMMMockRecorder { + return m.recorder +} + +// GetAMMPoolsBySubAccount mocks base method. +func (m *MockAMM) GetAMMPoolsBySubAccount() map[string]common.AMMPool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAMMPoolsBySubAccount") + ret0, _ := ret[0].(map[string]common.AMMPool) + return ret0 +} + +// GetAMMPoolsBySubAccount indicates an expected call of GetAMMPoolsBySubAccount. +func (mr *MockAMMMockRecorder) GetAMMPoolsBySubAccount() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAMMPoolsBySubAccount", reflect.TypeOf((*MockAMM)(nil).GetAMMPoolsBySubAccount)) +} + +// GetAllSubAccounts mocks base method. +func (m *MockAMM) GetAllSubAccounts() []string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAllSubAccounts") + ret0, _ := ret[0].([]string) + return ret0 +} + +// GetAllSubAccounts indicates an expected call of GetAllSubAccounts. +func (mr *MockAMMMockRecorder) GetAllSubAccounts() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAllSubAccounts", reflect.TypeOf((*MockAMM)(nil).GetAllSubAccounts)) +} diff --git a/core/execution/engine.go b/core/execution/engine.go index af6dc079b58..82fb32b1be1 100644 --- a/core/execution/engine.go +++ b/core/execution/engine.go @@ -42,6 +42,9 @@ var ( // ErrMarketDoesNotExist is returned when the market does not exist. ErrMarketDoesNotExist = errors.New("market does not exist") + // ErrNotAFutureMarket is returned when the market isn't a future market. + ErrNotAFutureMarket = errors.New("not a future market") + // ErrNoMarketID is returned when invalid (empty) market id was supplied during market creation. ErrNoMarketID = errors.New("no valid market id was supplied") @@ -139,9 +142,12 @@ type netParamsValues struct { liquidityV2SLANonPerformanceBondPenaltySlope num.Decimal liquidityV2StakeToCCYVolume num.Decimal liquidityV2ProvidersFeeCalculationTimeStep time.Duration + liquidityELSFeeFraction num.Decimal // only used for protocol upgrade to v0.74 chainID uint64 + + ammCommitmentQuantum *num.Uint } func defaultNetParamsValues() netParamsValues { @@ -172,6 +178,8 @@ func defaultNetParamsValues() netParamsValues { liquidityV2SLANonPerformanceBondPenaltySlope: num.DecimalFromInt64(-1), liquidityV2StakeToCCYVolume: num.DecimalFromInt64(-1), liquidityV2ProvidersFeeCalculationTimeStep: time.Second * 5, + + ammCommitmentQuantum: num.UintZero(), } } @@ -288,6 +296,54 @@ func (e *Engine) Hash() []byte { return crypto.Hash(bytes) } +func (e *Engine) ensureIsFutureMarket(market string) error { + if _, exist := e.allMarkets[market]; !exist { + return ErrMarketDoesNotExist + } + + if _, isFuture := e.futureMarkets[market]; !isFuture { + return ErrNotAFutureMarket + } + + return nil +} + +func (e *Engine) SubmitAMM( + ctx context.Context, + submit *types.SubmitAMM, + deterministicID string, +) error { + if err := e.ensureIsFutureMarket(submit.MarketID); err != nil { + return err + } + + return e.allMarkets[submit.MarketID].SubmitAMM(ctx, submit, deterministicID) +} + +func (e *Engine) AmendAMM( + ctx context.Context, + submit *types.AmendAMM, + deterministicID string, +) error { + if err := e.ensureIsFutureMarket(submit.MarketID); err != nil { + return err + } + + return e.allMarkets[submit.MarketID].AmendAMM(ctx, submit, deterministicID) +} + +func (e *Engine) CancelAMM( + ctx context.Context, + cancel *types.CancelAMM, + deterministicID string, +) error { + if err := e.ensureIsFutureMarket(cancel.MarketID); err != nil { + return err + } + + return e.allMarkets[cancel.MarketID].CancelAMM(ctx, cancel, deterministicID) +} + // RejectMarket will stop the execution of the market // and refund into the general account any funds in margins accounts from any parties // This works only if the market is in a PROPOSED STATE. @@ -852,6 +908,10 @@ func (e *Engine) propagateSpotInitialNetParams(ctx context.Context, mkt *spot.Ma mkt.OnMarketPartiesMaximumStopOrdersUpdate(ctx, e.npv.marketPartiesMaximumStopOrdersUpdate) e.propagateSLANetParams(ctx, mkt, isRestore) + + if !e.npv.liquidityELSFeeFraction.IsZero() { + mkt.OnMarketLiquidityEquityLikeShareFeeFractionUpdate(e.npv.liquidityELSFeeFraction) + } return nil } @@ -899,9 +959,14 @@ func (e *Engine) propagateInitialNetParamsToFutureMarket(ctx context.Context, mk if e.npv.internalCompositePriceUpdateFrequency > 0 { mkt.OnInternalCompositePriceUpdateFrequency(ctx, e.npv.internalCompositePriceUpdateFrequency) } + if !e.npv.liquidityELSFeeFraction.IsZero() { + mkt.OnMarketLiquidityEquityLikeShareFeeFractionUpdate(e.npv.liquidityELSFeeFraction) + } mkt.OnMarketPartiesMaximumStopOrdersUpdate(ctx, e.npv.marketPartiesMaximumStopOrdersUpdate) + mkt.OnAMMMinCommitmentQuantumUpdate(ctx, e.npv.ammCommitmentQuantum) + e.propagateSLANetParams(ctx, mkt, isRestore) return nil @@ -1781,6 +1846,19 @@ func (e *Engine) OnMarketLiquidityMaximumLiquidityFeeFactorLevelUpdate(_ context return nil } +func (e *Engine) OnMarketLiquidityEquityLikeShareFeeFractionUpdate(_ context.Context, d num.Decimal) error { + if e.log.IsDebug() { + e.log.Debug("update market liquidity equityLikeShareFeeFraction", + logging.Decimal("market.liquidity.equityLikeShareFeeFraction", d), + ) + } + for _, mkt := range e.allMarketsCpy { + mkt.OnMarketLiquidityEquityLikeShareFeeFractionUpdate(d) + } + e.npv.liquidityELSFeeFraction = d + return nil +} + func (e *Engine) OnMarketProbabilityOfTradingTauScalingUpdate(ctx context.Context, d num.Decimal) error { if e.log.IsDebug() { e.log.Debug("update probability of trading tau scaling", @@ -1854,6 +1932,16 @@ func (e *Engine) OnMaxPeggedOrderUpdate(ctx context.Context, max *num.Uint) erro return nil } +func (e *Engine) OnMarketAMMMinCommitmentQuantum(ctx context.Context, c *num.Uint) error { + if e.log.IsDebug() { + e.log.Debug("update amm min commitment quantum", + logging.BigUint("commitment-quantum", c), + ) + } + e.npv.ammCommitmentQuantum = c + return nil +} + func (e *Engine) MarketExists(market string) bool { _, ok := e.allMarkets[market] return ok diff --git a/core/execution/future/market.go b/core/execution/future/market.go index e4aff333d87..8309bf9e75a 100644 --- a/core/execution/future/market.go +++ b/core/execution/future/market.go @@ -26,6 +26,7 @@ import ( "code.vegaprotocol.io/vega/core/assets" "code.vegaprotocol.io/vega/core/collateral" "code.vegaprotocol.io/vega/core/events" + "code.vegaprotocol.io/vega/core/execution/amm" "code.vegaprotocol.io/vega/core/execution/common" "code.vegaprotocol.io/vega/core/execution/liquidation" "code.vegaprotocol.io/vega/core/execution/stoporders" @@ -164,6 +165,8 @@ type Market struct { partyMarginFactor map[string]num.Decimal markPriceCalculator *common.CompositePriceCalculator internalCompositePriceCalculator *common.CompositePriceCalculator + + amm *amm.Engine } // NewMarket creates a new market using the market framework configuration and creates underlying engines. @@ -260,9 +263,11 @@ func NewMarket( equityShares := common.NewEquityShares(num.DecimalZero()) + // we can't pass in the AMM at this point marketLiquidity := common.NewMarketLiquidity( log, liquidityEngine, collateralEngine, broker, book, equityShares, marketActivityTracker, feeEngine, common.FutureMarketType, mkt.ID, asset, priceFactor, mkt.LiquiditySLAParams.PriceRange, + nil, ) // The market is initially created in a proposed state @@ -336,6 +341,14 @@ func NewMarket( banking: banking, markPriceCalculator: common.NewCompositePriceCalculator(ctx, mkt.MarkPriceConfiguration, oracleEngine, timeService), } + + market.amm = amm.New(log, broker, collateralEngine, market, riskEngine, positionEngine, priceFactor, positionFactor, marketActivityTracker) + // now set AMM engine on liquidity market. + market.liquidity.SetAMM(market.amm) + + // this isn't the nicest way to resolve the dependencies + market.matching.SetOffbookSource(market.amm) + market.markPriceCalculator.SetOraclePriceScalingFunc(market.scaleOracleData) if market.IsPerp() { @@ -346,6 +359,9 @@ func NewMarket( } } + // now set AMM engine on liquidity market. + market.liquidity.SetAMM(market.amm) + assets, _ := mkt.GetAssets() market.settlementAsset = assets[0] @@ -395,6 +411,10 @@ func (m *Market) OnEpochEvent(ctx context.Context, epoch types.Epoch) { m.updateLiquidityFee(ctx) } +func (m *Market) ClosePosition(context.Context, string) bool { + return true +} + func (m *Market) OnEpochRestore(ctx context.Context, epoch types.Epoch) { m.epoch = epoch m.liquidityEngine.OnEpochRestore(epoch) @@ -1033,6 +1053,7 @@ func (m *Market) OnTick(ctx context.Context, t time.Time) bool { } m.liquidity.OnTick(ctx, t) + m.amm.OnTick(ctx, t) // check auction, if any. If we leave auction, MTM is performed in this call m.checkAuction(ctx, t, m.idgen) @@ -1235,6 +1256,10 @@ func (m *Market) cleanMarketWithState(ctx context.Context, mktState types.Market m.internalCompositePriceCalculator.Close(ctx) } + if err := m.amm.MarketClosing(ctx); err != nil { + return err + } + m.mkt.State = mktState m.mkt.TradingMode = types.MarketTradingModeNoTrading m.mkt.MarketTimestamps.Close = m.timeService.GetTimeNow().UnixNano() @@ -2614,6 +2639,14 @@ func (m *Market) handleConfirmationPassiveOrders( // Insert or update passive orders siting on the book for _, order := range conf.PassiveOrdersAffected { + // if the order was generated by an offbook source such as an AMM we need to register the order here + // since it was never registered as an incoming order. + if order.GeneratedOffbook { + cpy := order.Clone() + cpy.Remaining = cpy.Size // remaining will be 0 since it has traded, so we copy it back to its full size to register + m.position.RegisterOrder(ctx, cpy) + } + // set the `updatedAt` value as these orders have changed order.UpdatedAt = m.timeService.GetTimeNow().UnixNano() evts = append(evts, events.NewOrderEvent(ctx, order)) @@ -2796,6 +2829,9 @@ func (m *Market) confirmMTM(ctx context.Context, skipMargin bool) { // release excess margin for all positions m.recheckMargin(ctx, m.position.Positions()) } + + // tell the AMM engine we've MTM'd so any closing pool's can be cancelled + m.amm.OnMTM(ctx) } func (m *Market) handleRiskEvts(ctx context.Context, margins []events.Risk, isolatedMargin []events.Risk) []*types.Order { @@ -2838,6 +2874,7 @@ func (m *Market) handleRiskEvts(ctx context.Context, margins []events.Risk, isol closed = closedRecalculated } } + closed = append(closed, isolatedForCloseout...) if len(closed) == 0 { m.updateLiquidityFee(ctx) @@ -2856,9 +2893,16 @@ func (m *Market) handleRiskEvts(ctx context.Context, margins []events.Risk, isol // updateLiquidityFee computes the current LiquidityProvision fee and updates // the fee engine. func (m *Market) updateLiquidityFee(ctx context.Context) { - var fee num.Decimal - provisions := m.liquidityEngine.ProvisionsPerParty() + provisions := m.liquidityEngine.ProvisionsPerParty().Clone() + for party, pool := range m.amm.GetAMMPoolsBySubAccount() { + provisions[party] = &types.LiquidityProvision{ + Party: party, + CommitmentAmount: pool.CommitmentAmount(), + Fee: pool.LiquidityFee(), + } + } + var fee num.Decimal switch m.mkt.Fees.LiquidityFeeSettings.Method { case types.LiquidityFeeMethodConstant: if len(provisions) != 0 { @@ -3042,6 +3086,9 @@ func (m *Market) finalizePartiesCloseOut( m.marketActivityTracker.RecordPosition(m.settlementAsset, mp.Party(), m.mkt.ID, 0, mp.Price(), m.positionFactor, m.timeService.GetTimeNow()) } + // if the distressed party was an AMM we need to stop it AMM-ing + m.amm.RemoveDistressed(ctx, closedMPs) + // finally remove from collateral (moving funds where needed) movements, err := m.collateral.RemoveDistressed( ctx, closedMPs, m.GetID(), m.settlementAsset, m.useGeneralAccountForMarginSearch) @@ -5019,3 +5066,33 @@ func (m *Market) emitPartyMarginModeUpdated(ctx context.Context, party string, m func (m *Market) GetFillPrice(volume uint64, side types.Side) (*num.Uint, error) { return m.matching.GetFillPrice(volume, side) } + +func (m *Market) SubmitAMM(ctx context.Context, submit *types.SubmitAMM, deterministicID string) error { + target := m.getCurrentMarkPrice() + if m.as.InAuction() { + target = nil + } + err := m.amm.SubmitAMM(ctx, submit, deterministicID, target) + return err +} + +func (m *Market) AmendAMM(ctx context.Context, amend *types.AmendAMM, deterministicID string) error { + return m.amm.AmendAMM(ctx, amend, deterministicID) +} + +func (m *Market) CancelAMM(ctx context.Context, cancel *types.CancelAMM, deterministicID string) error { + closeout, err := m.amm.CancelAMM(ctx, cancel) + if err != nil { + return err + } + + if closeout == nil { + return nil + } + + // pool is closed but now its position needs to be closed out + m.idgen = idgeneration.New(deterministicID) + defer func() { m.idgen = nil }() + m.resolveClosedOutParties(ctx, []events.Margin{closeout}) + return nil +} diff --git a/core/execution/future/market_callbacks.go b/core/execution/future/market_callbacks.go index f25f76c2bb2..5d98ef140f1 100644 --- a/core/execution/future/market_callbacks.go +++ b/core/execution/future/market_callbacks.go @@ -24,6 +24,10 @@ import ( "code.vegaprotocol.io/vega/libs/num" ) +func (m *Market) OnAMMMinCommitmentQuantumUpdate(ctx context.Context, c *num.Uint) { + m.amm.OnMinCommitmentQuantumUpdate(ctx, c) +} + func (m *Market) OnMarketMinLpStakeQuantumMultipleUpdate(_ context.Context, d num.Decimal) { m.liquidity.OnMinLPStakeQuantumMultiple(d) } @@ -144,3 +148,7 @@ func (m *Market) OnMarketLiquidityV2StakeToCCYVolume(d num.Decimal) { func (m *Market) OnMarketLiquidityV2ProvidersFeeCalculationTimeStep(d time.Duration) { m.liquidity.OnProvidersFeeCalculationTimeStep(d) } + +func (m *Market) OnMarketLiquidityEquityLikeShareFeeFractionUpdate(d num.Decimal) { + m.liquidity.SetELSFeeFraction(d) +} diff --git a/core/execution/future/market_snapshot.go b/core/execution/future/market_snapshot.go index 7d5209c5f51..16b0a23d345 100644 --- a/core/execution/future/market_snapshot.go +++ b/core/execution/future/market_snapshot.go @@ -22,6 +22,7 @@ import ( "time" "code.vegaprotocol.io/vega/core/assets" + "code.vegaprotocol.io/vega/core/execution/amm" "code.vegaprotocol.io/vega/core/execution/common" "code.vegaprotocol.io/vega/core/execution/liquidation" "code.vegaprotocol.io/vega/core/execution/stoporders" @@ -162,10 +163,15 @@ func NewMarketFromSnapshot( } } - marketLiquidity := common.NewMarketLiquidityFromSnapshot( + // just check for nil first just in case we are on a protocol upgrade from a version were AMM were not supported. + // @TODO pass in AMM + marketLiquidity, err := common.NewMarketLiquidityFromSnapshot( log, liquidityEngine, collateralEngine, broker, book, equityShares, marketActivityTracker, - feeEngine, common.FutureMarketType, mkt.ID, asset, priceFactor, em.MarketLiquidity, + feeEngine, common.FutureMarketType, mkt.ID, asset, priceFactor, em.MarketLiquidity, nil, ) + if err != nil { + return nil, err + } // backward compatibility check for nil stopOrders := stoporders.New(log) @@ -254,6 +260,20 @@ func NewMarketFromSnapshot( market.internalCompositePriceCalculator.SetOraclePriceScalingFunc(market.scaleOracleData) } + // just check for nil first just in case we are on a protocol upgrade from a version were AMM were not supported. + if em.Amm == nil { + market.amm = amm.New(log, broker, collateralEngine, market, market.risk, market.position, market.priceFactor, positionFactor, marketActivityTracker) + } else { + market.amm = amm.NewFromProto(log, broker, collateralEngine, market, market.risk, market.position, em.Amm, market.priceFactor, positionFactor, marketActivityTracker) + } + // now we can set the AMM on the market liquidity engine. + market.liquidity.SetAMM(market.amm) + + book.SetOffbookSource(market.amm) + + // now set AMM engine on liquidity market. + market.liquidity.SetAMM(market.amm) + for _, p := range em.Parties { market.parties[p] = struct{}{} } @@ -350,6 +370,7 @@ func (m *Market) GetState() *types.ExecMarket { FeesStats: m.fee.GetState(assetQuantum), PartyMarginFactors: partyMarginFactors, MarkPriceCalculator: m.markPriceCalculator.IntoProto(), + Amm: m.amm.IntoProto(), MarketLiquidity: m.liquidity.GetState(), } if m.perp && m.internalCompositePriceCalculator != nil { diff --git a/core/execution/spot/market.go b/core/execution/spot/market.go index d4eca82ca0b..94258c3c714 100644 --- a/core/execution/spot/market.go +++ b/core/execution/spot/market.go @@ -217,7 +217,8 @@ func NewMarket( mkt.MarketTimestamps = ts liquidity := liquidity.NewSnapshotEngine(liquidityConfig, log, timeService, broker, riskModel, pMonitor, book, as, quoteAsset, mkt.ID, stateVarEngine, positionFactor, mkt.LiquiditySLAParams) els := common.NewEquityShares(num.DecimalZero()) - marketLiquidity := common.NewMarketLiquidity(log, liquidity, collateralEngine, broker, book, els, marketActivityTracker, feeEngine, common.SpotMarketType, mkt.ID, quoteAsset, priceFactor, mkt.LiquiditySLAParams.PriceRange) + // @TODO pass in AMM + marketLiquidity := common.NewMarketLiquidity(log, liquidity, collateralEngine, broker, book, els, marketActivityTracker, feeEngine, common.SpotMarketType, mkt.ID, quoteAsset, priceFactor, mkt.LiquiditySLAParams.PriceRange, nil) market := &Market{ log: log, idgen: nil, @@ -259,7 +260,6 @@ func NewMarket( banking: banking, } liquidity.SetGetStaticPricesFunc(market.getBestStaticPricesDecimal) - return market, nil } @@ -3225,6 +3225,18 @@ func (m *Market) GetMarketCounters() *types.MarketCounters { } } +func (m *Market) SubmitAMM(context.Context, *types.SubmitAMM, string) error { + return errors.New("unimplemented") +} + +func (m *Market) AmendAMM(context.Context, *types.AmendAMM, string) error { + return errors.New("unimplemented") +} + +func (m *Market) CancelAMM(context.Context, *types.CancelAMM, string) error { + return errors.New("unimplemented") +} + // IDGen is an id generator for orders. type IDGen interface { NextID() string diff --git a/core/execution/spot/market_callbacks.go b/core/execution/spot/market_callbacks.go index 049f993e38a..e7d2a33635e 100644 --- a/core/execution/spot/market_callbacks.go +++ b/core/execution/spot/market_callbacks.go @@ -116,3 +116,7 @@ func (m *Market) OnMarketLiquidityV2ProvidersFeeCalculationTimeStep(d time.Durat func (m *Market) OnMarketLiquidityV2BondPenaltyFactorUpdate(d num.Decimal) { m.liquidity.OnBondPenaltyFactorUpdate(d) } + +func (m *Market) OnMarketLiquidityEquityLikeShareFeeFractionUpdate(d num.Decimal) { + m.liquidity.SetELSFeeFraction(d) +} diff --git a/core/execution/spot/market_snapshot.go b/core/execution/spot/market_snapshot.go index 6b529e6f83f..13e2770c96b 100644 --- a/core/execution/spot/market_snapshot.go +++ b/core/execution/spot/market_snapshot.go @@ -126,8 +126,10 @@ func NewMarketFromSnapshot( } } - marketLiquidity := common.NewMarketLiquidityFromSnapshot(log, liquidity, collateralEngine, broker, book, els, marketActivityTracker, feeEngine, common.SpotMarketType, mkt.ID, quoteAsset, priceFactor, em.MarketLiquidity) - + marketLiquidity, err := common.NewMarketLiquidityFromSnapshot(log, liquidity, collateralEngine, broker, book, els, marketActivityTracker, feeEngine, common.SpotMarketType, mkt.ID, quoteAsset, priceFactor, em.MarketLiquidity, nil) + if err != nil { + return nil, err + } // backward compatibility check for nil stopOrders := stoporders.New(log) if em.StopOrders != nil { diff --git a/core/integration/docs/AMM.md b/core/integration/docs/AMM.md new file mode 100644 index 00000000000..09949ff44f6 --- /dev/null +++ b/core/integration/docs/AMM.md @@ -0,0 +1,210 @@ +## Integration test framework for AMM + +### Creating, amending and submitting AMMs + +To create a new AMM submission: + +``` +When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | error | + | party id | market ID | commitment amount | tolerance as float | uint | min price uint | max price uint | margin ratio at lower bound as float | margin ratio at upper bound as float | OPTIONAL: error expected on submission | +``` + +All fields, except for `error` are required here. + +Once an AMM has been created, we may want to amend it, so to amend an existing AMM: + +``` +Then the parties ammend the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | error | + | party id (REQUIRED) | market ID (REQUIRED) | optional: uint | float (REQUIRED) | optional | optional | optional | optional | optional | optional | +``` + +The only 3 fields that are required are `party`, `market id`, and `slippage`. Any other fields omitted will not be updated. + +Lastly, cancelling an existing AMM can be done through: + +``` +And the parties cancel the following AMM: + | party | market id | method | error | + | party id | market ID | cancellation method | OPTIONAL: error expected | +``` + +The possible values for `method` are `METHOD_IMMEDIATE` or `METHOD_REDUCE_ONLY`. Technically `METHOD_UNSPECIFIED` is also a valid value for `method`, but doesn't apply for integration tests. + +### Checking AMM pools + +To see what's going on with an existing AMM, we can check the AMM pool events with the following steps: + +``` +Then the AMM pool status should be: + | party | market id | amount | status | reason | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | party ID | market ID | commitment amout | AMM pool status | OPTIONAL: AMM status reason | uint | uint | uint | float | float | +``` + +Required fields are `party`, `market id`, `amount`, and `status`. All others are optional. possible values for AMM pool status are: + +``` +STATUS_UNSPECIFIED (not applicable) +STATUS_ACTIVE +STATUS_REJECTED +STATUS_CANCELLED +STATUS_STOPPED +STATUS_REDUCE_ONLY +``` + +The possible `AMM status reason` values are: + +``` +STATUS_REASON_UNSPECIFIED +STATUS_REASON_CANCELLED_BY_PARTY +STATUS_REASON_CANNOT_FILL_COMMITMENT +STATUS_REASON_PARTY_ALREADY_OWNS_A_POOL +STATUS_REASON_PARTY_CLOSED_OUT +STATUS_REASON_MARKET_CLOSED +STATUS_REASON_COMMITMENT_TOO_LOW +STATUS_REASON_CANNOT_REBASE +``` + +Checking the status for a given AMM only checks the most recent AMMPool event that was emitted. If we need to check all statuses a given AMM passed through during a scenario, use the following step: + +``` +And the following AMM pool events should be emitted: + | party | market id | amount | status | reason | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | party ID | market ID | commitment amout | AMM pool status | OPTIONAL: AMM status reason | uint | uint | uint | float | float | +``` + +The table data is identical to that used in the previous step, with the same optional/required fields. The difference here is that we can check whether the correct events were emitted in a scenario like this: + +``` +When +When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | party1 | ETH/DEC24 | 10000 | 0.1 | 1000 | 900 | 1100 | 0.2 | 0.15 | +Then the parties amend the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | upper margin ratio | + | party1 | ETH/DEC24 | 20000 | 0.15 | 1010 | 910 | 1110 | 0.2 | +# simple status check, only 1 event can be checked, checking for the initial submission will fail +And the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | party1 | ETH/DEC24 | 20000 | STATUS_ACTIVE | 1010 | 910 | 1110 | 0.2 | 0.2 | +When the parties cancel the following AMM: + | party | market id | method | + | party1 | ETH/DEC24 | METHOD_IMMEDIATE | +# check all events emitted so far +Then the following AMM pool events should be emitted: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | reason | + | party1 | ETH/DEC24 | 10000 | STATUS_ACTIVE | 1000 | 900 | 1100 | 0.2 | 0.15 | | + | party1 | ETH/DEC24 | 20000 | STATUS_ACTIVE | 1010 | 910 | 1110 | 0.2 | 0.2 | | + | party1 | ETH/DEC24 | 20000 | STATUS_CANCELLED | 1010 | 910 | 1110 | 0.2 | 0.2 | STATUS_REASON_CANCELLED_BY_PARTY | +``` + +### Checking AMM account balances and transfers + +The AMM pool and sub-accounts are assigned derrived ID's, which can't be specified from the integration test scenario. To allow verifying the balances of the accounts, and check whether or not the expected transfers to and from said account happened, it's possible to assign aliases to the derived ID's. + +``` +Then set the following AMM sub account aliases: + | party | market id | alias | + | party ID | market ID | account owner alias | +``` + +This step _must_ be used _after_ the AMM submission has been made (ie after we've created the AMM pool), otherwise it will fail. + +Once an alias has been created, we can check the balance of the AMM pool account using the following step: + +``` +Then parties have the following AMM account balances: + | account alias | asset | balance | + | alias set earlier | asset | expected balance | +``` + +The alias set in the first step is mapped to the internally derived ID, and the balance will be checked in the normal way (getting the most recent account balance event, compare the balance to the expected amount). + +Checking transfers is done through the existing step, but a new optional field was added: + +``` +Then the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | type | is amm | + | from owner | from account type | to owner | to account type | market ID | amount | asset | OPTIONAL: transfer type | OPTIONAL: bool | +``` + +The new field `is amm` should be `true` for transfers involving AMM sub-accounts. An AMM sub-account is defined as being a general account, does not have a market, and the owner is a pre-defined alias (as per above). For example, a transfer from a general account to an AMM pool sub-account would look something like this: + +``` +When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | party1 | ETH/DEC24 | 10000 | 0.1 | 1000 | 900 | 1100 | 0.2 | 0.15 | +Then set the the following AMM sub account aliases: + | party | market id | alias | + | party1 | ETH/DEC24 | party1-amm-acc | +And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | + | party1 | ACCOUNT_TYPE_GENERAL | party1-amm-acc | ACCOUNT_TYPE_GENERAL | | 10000 | ETH | true | +``` + +It's important to note that a vAMM will be receiving fees from particular markets, and when holding a position, will create a margin account on the given market, transfers for this can be checked using the same alias like so: + +``` +And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 1 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 2 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 88 | USD | true | TRANSFER_TYPE_MTM_LOSS | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 274 | USD | true | TRANSFER_TYPE_MARGIN_LOW | +``` + +### Checking AMM trades + +Because the parties who created the vAMM don't actually trade directly, the derived party ID will appear as the buyer or seller. The account owner alias created above should therefore be used to check the buyer/seller of trades involving the vAMM pools: + +``` +Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party5 | 106 | 1 | vamm1-alias | true | + | party5 | 110 | 1 | party2 | | + | party5 | 128 | 2 | vamm1-alias | true | + | party5 | 140 | 1 | party4 | | +``` + +This step has added the `is amm` column (optional) which should be set to `true` to lookup the actual party ID using the vAMM alias created in the step outlined above. + +### Checking vAMM position + +Like any party, we may want to check the overall position of a vAMM pool. To do this, we can use the existing step to check the profit and loss. Like with the trade-check and transfer checks, a boolean column `is amm` was added to instruct the integration test framewokr to interpret the party ID given as being a vAMM alias. + +``` +Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party5 | 5 | 88 | 0 | | + | party1 | 1 | 40 | 0 | | + | party2 | -2 | -70 | 0 | | + | party4 | -1 | 0 | 0 | | + | vamm1-id | -3 | -58 | 0 | true | +``` + +### Checking AMM account balances + +Just like checking trades and positions, checking the `vAMM` account balances can be done using the optional `is amm` column to the table provided to the relevant step. + +``` +Then the parties should have the following account balances: + | party | asset | market | general | margin | is amm | + | party1 | USD | ETH/MAR22 | 100000 | 0 | | + | vamm1-id | USD | ETH/MAR22 | 123 | 456 | true | +``` + +### DEBUG STEPS + +The debug steps specific to AMMs are simply ways of printing out the AMM pool event data in human-readable form: + +``` +# simply dump all AMM pool events +debug all AMM pool events +# debug all AMM pool events for a given party +debug AMM pool events for party "([^"]+)" +# debug all AMM pool events for a given market +debug all AMM pool events for market "([^"]+)" +# debug all AMM pool events for a given market and party +debug all AMM pool events for market "([^"]+)" and party "([^"]+)" +``` diff --git a/core/integration/execution_test.go b/core/integration/execution_test.go index 4bad416d96a..e4865874f5e 100644 --- a/core/integration/execution_test.go +++ b/core/integration/execution_test.go @@ -46,17 +46,30 @@ type batchIntruction struct { // if any of the ingress methods returns an error (as the processor would). type exEng struct { *execution.Engine - broker *stubs.BrokerStub - batch *batchIntruction + broker *stubs.BrokerStub + batch *batchIntruction + ammAlias map[string]string } func newExEng(e *execution.Engine, broker *stubs.BrokerStub) *exEng { return &exEng{ - Engine: e, - broker: broker, + Engine: e, + broker: broker, + ammAlias: map[string]string{}, } } +// GetAMMSubAccountID returns the derived account ID based on the alias. +func (e *exEng) GetAMMSubAccountID(alias string) (string, bool) { + id, ok := e.ammAlias[alias] + return id, ok +} + +// SetAMMSubAccountIDAlias creates an alias for a derived AMM sub account. +func (e *exEng) SetAMMSubAccountIDAlias(alias, id string) { + e.ammAlias[alias] = id +} + func (e *exEng) BlockEnd(ctx context.Context) { // set hash ID to some value ctx = vgcontext.WithTraceID(ctx, "deadbeef") @@ -201,6 +214,33 @@ func (e *exEng) ProcessBatch(ctx context.Context, party string) error { return nil } +func (e *exEng) SubmitAMM(ctx context.Context, submission *types.SubmitAMM) error { + idgen := idgeneration.New(vgcrypto.RandomHash()) + if err := e.Engine.SubmitAMM(ctx, submission, idgen.NextID()); err != nil { + e.broker.Send(events.NewTxErrEvent(ctx, err, submission.Party, submission.IntoProto(), "submitAMM")) + return err + } + return nil +} + +func (e *exEng) AmendAMM(ctx context.Context, submission *types.AmendAMM) error { + idgen := idgeneration.New(vgcrypto.RandomHash()) + if err := e.Engine.AmendAMM(ctx, submission, idgen.NextID()); err != nil { + e.broker.Send(events.NewTxErrEvent(ctx, err, submission.Party, submission.IntoProto(), "amendAMM")) + return err + } + return nil +} + +func (e *exEng) CancelAMM(ctx context.Context, cancel *types.CancelAMM) error { + idgen := idgeneration.New(vgcrypto.RandomHash()) + if err := e.Engine.CancelAMM(ctx, cancel, idgen.NextID()); err != nil { + e.broker.Send(events.NewTxErrEvent(ctx, err, cancel.Party, cancel.IntoProto(), "cancelAMM")) + return err + } + return nil +} + type noopValidation struct{} func (n noopValidation) CheckOrderCancellation(cancel *commandspb.OrderCancellation) error { diff --git a/core/integration/features/accounts/2943-distressed-trader-has-general-balance.feature b/core/integration/features/accounts/2943-distressed-trader-has-general-balance.feature index c9a784e6b50..0e4e7634d4b 100644 --- a/core/integration/features/accounts/2943-distressed-trader-has-general-balance.feature +++ b/core/integration/features/accounts/2943-distressed-trader-has-general-balance.feature @@ -11,6 +11,7 @@ Feature: Distressed parties should not have general balance left | network.markPriceUpdateMaximumFrequency | 0s | | limits.markets.maxPeggedOrders | 4 | | market.liquidity.providersFeeCalculationTimeStep | 1s | + | market.liquidity.equityLikeShareFeeFraction | 1 | Scenario: Upper bound breached Given the parties deposit on asset's general account the following amount: diff --git a/core/integration/features/amm/0087-VAMM-001.feature b/core/integration/features/amm/0087-VAMM-001.feature new file mode 100644 index 00000000000..b8d6780cea3 --- /dev/null +++ b/core/integration/features/amm/0087-VAMM-001.feature @@ -0,0 +1,103 @@ +Feature: Test vAMM submission works as expected + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.1 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + And the price monitoring named "price-monitoring": + | horizon | probability | auction extension | + | 3600 | 0.95 | 3 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | price-monitoring | default-eth-for-future | 1e0 | 0 | SLA-22 | + + @VAMM + Scenario: 0087-VAMM-001: When market.amm.minCommitmentQuantum is 1, mid price of the market 100, a user with 1000 USDT is able to create a vAMM with commitment 1000, base price 100, upper price 150, lower price 85 and leverage ratio at each bound 0.25. + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 100000 | + | lp2 | USD | 100000 | + | lp3 | USD | 100000 | + | party1 | USD | 100000 | + | party2 | USD | 100000 | + | party3 | USD | 100000 | + | vamm1 | USD | 1000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 600 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 400 | 0.015 | submission | + Then the network moves ahead "4" blocks + And the current epoch is "0" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party3 | ETH/MAR22 | buy | 10 | 85 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | buy | 10 | 90 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 10 | 110 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party3 | ETH/MAR22 | sell | 1 | 120 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | buy | 10 | 95 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | lp1 | ETH/MAR22 | sell | 10 | 105 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 3600 | 94 | 106 | 39 | 1000 | 1 | 100 | 100 | 100 | + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.1 | 100 | 85 | 150 | 0.25 | 0.25 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 85 | 150 | 0.25 | 0.25 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-acc | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-acc | ACCOUNT_TYPE_GENERAL | | 1000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | diff --git a/core/integration/features/amm/0087-VAMM-002.feature b/core/integration/features/amm/0087-VAMM-002.feature new file mode 100644 index 00000000000..769c03a99e6 --- /dev/null +++ b/core/integration/features/amm/0087-VAMM-002.feature @@ -0,0 +1,104 @@ +Feature: Test vAMM submission works as expected + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.1 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + And the price monitoring named "price-monitoring": + | horizon | probability | auction extension | + | 3600 | 0.95 | 3 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | price-monitoring | default-eth-for-future | 1e0 | 0 | SLA-22 | + + @VAMM + Scenario: 0087-VAMM-002: When market.amm.minCommitmentQuantum is 1, mid price of the market 100, a user with 1000 USDT is able to create a vAMM with commitment 1000, base price 100, no upper price, lower price 85 and leverage ratio at lower bound 0.25 + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 100000 | + | lp2 | USD | 100000 | + | lp3 | USD | 100000 | + | party1 | USD | 100000 | + | party2 | USD | 100000 | + | party3 | USD | 100000 | + | vamm1 | USD | 1000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 600 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 400 | 0.015 | submission | + Then the network moves ahead "4" blocks + And the current epoch is "0" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party3 | ETH/MAR22 | buy | 10 | 85 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | buy | 10 | 90 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 10 | 110 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party3 | ETH/MAR22 | sell | 1 | 120 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | buy | 10 | 95 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | lp1 | ETH/MAR22 | sell | 10 | 105 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 3600 | 94 | 106 | 39 | 1000 | 1 | 100 | 100 | 100 | + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | lower margin ratio | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.1 | 100 | 85 | 0.25 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | lower margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 85 | 0.25 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-acc | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-acc | ACCOUNT_TYPE_GENERAL | | 1000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + diff --git a/core/integration/features/amm/0087-VAMM-003.feature b/core/integration/features/amm/0087-VAMM-003.feature new file mode 100644 index 00000000000..0309bb380b3 --- /dev/null +++ b/core/integration/features/amm/0087-VAMM-003.feature @@ -0,0 +1,104 @@ +Feature: Test vAMM submission works as expected + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.1 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + And the price monitoring named "price-monitoring": + | horizon | probability | auction extension | + | 3600 | 0.95 | 3 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | price-monitoring | default-eth-for-future | 1e0 | 0 | SLA-22 | + + @VAMM + Scenario: 0087-VAMM-003: When market.amm.minCommitmentQuantum is 1, mid price of the market 100, a user with 1000 USDT is able to create a vAMM with commitment 1000, base price 100, upper price 150, no lower price and leverage ratio at upper bound 0.25 + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 100000 | + | lp2 | USD | 100000 | + | lp3 | USD | 100000 | + | party1 | USD | 100000 | + | party2 | USD | 100000 | + | party3 | USD | 100000 | + | vamm1 | USD | 1000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 600 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 400 | 0.015 | submission | + Then the network moves ahead "4" blocks + And the current epoch is "0" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party3 | ETH/MAR22 | buy | 10 | 85 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | buy | 10 | 90 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 10 | 110 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party3 | ETH/MAR22 | sell | 1 | 120 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | buy | 10 | 95 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | lp1 | ETH/MAR22 | sell | 10 | 105 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 3600 | 94 | 106 | 39 | 1000 | 1 | 100 | 100 | 100 | + When the parties submit the following AMM: + | party | market id | amount | slippage | base | upper bound | upper margin ratio | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.1 | 100 | 150 | 0.25 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | upper bound | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 150 | 0.25 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-acc | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-acc | ACCOUNT_TYPE_GENERAL | | 1000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + diff --git a/core/integration/features/amm/0087-VAMM-004.feature b/core/integration/features/amm/0087-VAMM-004.feature new file mode 100644 index 00000000000..5ccfeb95f14 --- /dev/null +++ b/core/integration/features/amm/0087-VAMM-004.feature @@ -0,0 +1,132 @@ +Feature: Test vAMM submission works as expected (invalid submission) + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.1 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + And the price monitoring named "price-monitoring": + | horizon | probability | auction extension | + | 3600 | 0.95 | 3 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | price-monitoring | default-eth-for-future | 1e0 | 0 | SLA-22 | + + @VAMM + Scenario: 0087-VAMM-004: When market.amm.minCommitmentQuantum is 1, mid price of the market 100, a user with 100 USDT is unable to create a vAMM with commitment 1000, and any other combination of settings. + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 100000 | + | lp2 | USD | 100000 | + | lp3 | USD | 100000 | + | party1 | USD | 100000 | + | party2 | USD | 100000 | + | party3 | USD | 100000 | + | vamm1 | USD | 100 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 600 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 400 | 0.015 | submission | + Then the network moves ahead "4" blocks + And the current epoch is "0" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party3 | ETH/MAR22 | buy | 10 | 85 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | buy | 10 | 90 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 10 | 110 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party3 | ETH/MAR22 | sell | 1 | 120 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | buy | 10 | 95 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | lp1 | ETH/MAR22 | sell | 10 | 105 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 3600 | 94 | 106 | 39 | 1000 | 1 | 100 | 100 | 100 | + # Try all submissions from AC's 0087-VAMM-001 through 0087-VAMM-003, add some more for good measure + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | error | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.1 | 100 | 85 | 150 | 0.25 | 0.25 | not enough collateral in general account | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | lower margin ratio | upper bound | upper margin ratio | reason | + | vamm1 | ETH/MAR22 | 1000 | STATUS_REJECTED | 100 | 85 | 0.25 | 150 | 0.25 | STATUS_REASON_CANNOT_FILL_COMMITMENT | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | lower margin ratio | error | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.1 | 90 | 85 | 0.25 | not enough collateral in general account | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | lower margin ratio | reason | + | vamm1 | ETH/MAR22 | 1000 | STATUS_REJECTED | 90 | 85 | 0.25 | STATUS_REASON_CANNOT_FILL_COMMITMENT | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | upper bound | upper margin ratio | error | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.1 | 110 | 150 | 0.25 | not enough collateral in general account | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | upper bound | upper margin ratio | reason | + | vamm1 | ETH/MAR22 | 1000 | STATUS_REJECTED | 110 | 150 | 0.25 | STATUS_REASON_CANNOT_FILL_COMMITMENT | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | lower margin ratio | error | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.01 | 110 | 99 | 0.1 | not enough collateral in general account | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | lower margin ratio | reason | + | vamm1 | ETH/MAR22 | 1000 | STATUS_REJECTED | 110 | 99 | 0.1 | STATUS_REASON_CANNOT_FILL_COMMITMENT | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | upper bound | upper margin ratio | error | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.01 | 90 | 101 | 0.02 | not enough collateral in general account | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | upper bound | upper margin ratio | reason | + | vamm1 | ETH/MAR22 | 1000 | STATUS_REJECTED | 90 | 101 | 0.02 | STATUS_REASON_CANNOT_FILL_COMMITMENT | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | error | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.001 | 101 | 95 | 105 | 0.01 | 0.01 | not enough collateral in general account | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | lower margin ratio | upper bound | upper margin ratio | reason | + | vamm1 | ETH/MAR22 | 1000 | STATUS_REJECTED | 101 | 95 | 0.01 | 105 | 0.01 | STATUS_REASON_CANNOT_FILL_COMMITMENT | diff --git a/core/integration/features/amm/0087-VAMM-005.feature b/core/integration/features/amm/0087-VAMM-005.feature new file mode 100644 index 00000000000..0ae23a015f9 --- /dev/null +++ b/core/integration/features/amm/0087-VAMM-005.feature @@ -0,0 +1,165 @@ +Feature: Test vAMM submission works as expected (invalid submission) + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1000 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.1 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + And the price monitoring named "price-monitoring": + | horizon | probability | auction extension | + | 3600 | 0.95 | 3 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | price-monitoring | default-eth-for-future | 1e0 | 0 | SLA-22 | + + @VAMM + Scenario: 0087-VAMM-005: When market.amm.minCommitmentQuantum is 1000, mid price of the market 100, a user with 1000 USDT is able to create a vAMM with commitment 100, and any other combination of settings. + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 100000 | + | lp2 | USD | 100000 | + | lp3 | USD | 100000 | + | party1 | USD | 100000 | + | party2 | USD | 100000 | + | party3 | USD | 100000 | + | vamm1 | USD | 1000 | + | vamm2 | USD | 1000 | + | vamm3 | USD | 1000 | + | vamm4 | USD | 1000 | + | vamm5 | USD | 1000 | + | vamm6 | USD | 1000 | + | vamm7 | USD | 1000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 600 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 400 | 0.015 | submission | + Then the network moves ahead "4" blocks + And the current epoch is "0" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party3 | ETH/MAR22 | buy | 10 | 85 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | buy | 10 | 90 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 10 | 110 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party3 | ETH/MAR22 | sell | 1 | 120 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | buy | 10 | 95 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | lp1 | ETH/MAR22 | sell | 10 | 105 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 3600 | 94 | 106 | 39 | 1000 | 1 | 100 | 100 | 100 | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.1 | 100 | 85 | 150 | 0.25 | 0.25 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | lower margin ratio | upper bound | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 85 | 0.25 | 150 | 0.25 | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | lower margin ratio | error | proposed fee | + | vamm2 | ETH/MAR22 | 1000 | 0.1 | 90 | 85 | 0.25 | rebase target outside bounds | 0.01 | + # can't rebase because the target is 100 and thats outside of its bounds given there is no upper + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | lower margin ratio | reason | + | vamm2 | ETH/MAR22 | 1000 | STATUS_REJECTED | 90 | 85 | 0.25 | STATUS_REASON_CANNOT_REBASE | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | upper bound | upper margin ratio | error | proposed fee | + | vamm3 | ETH/MAR22 | 1000 | 0.1 | 110 | 150 | 0.25 | rebase target outside bounds | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | upper bound | upper margin ratio | reason | + | vamm3 | ETH/MAR22 | 1000 | STATUS_REJECTED | 110 | 150 | 0.25 | STATUS_REASON_CANNOT_REBASE | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | lower margin ratio | proposed fee | + | vamm4 | ETH/MAR22 | 1000 | 0.1 | 105 | 99 | 0.1 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | lower margin ratio | + | vamm4 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 105 | 99 | 0.1 | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | upper bound | upper margin ratio | error | proposed fee | + | vamm5 | ETH/MAR22 | 1000 | 0.1 | 99 | 101 | 0.02 | rebasing trade failed: OrderError: non-persistent order trades out of price bounds | 0.01 | + # the non-persistent rebasing order triggers price-monitoring so is rejected + Then the AMM pool status should be: + | party | market id | amount | status | base | upper bound | upper margin ratio | reason | + | vamm5 | ETH/MAR22 | 1000 | STATUS_REJECTED | 99 | 101 | 0.02 | STATUS_REASON_CANNOT_REBASE | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | proposed fee | + | vamm6 | ETH/MAR22 | 1000 | 0.001 | 101 | 95 | 105 | 0.01 | 0.01 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | lower margin ratio | upper bound | upper margin ratio | + | vamm6 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 101 | 95 | 0.01 | 105 | 0.01 | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | lower margin ratio | error | proposed fee | + | vamm7 | ETH/MAR22 | 1000 | 0.01 | 110 | 99 | 0.1 | rebase-order did not trade | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | lower margin ratio | + | vamm7 | ETH/MAR22 | 1000 | STATUS_REJECTED | 110 | 99 | 0.1 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-acc | + | vamm2 | ETH/MAR22 | vamm2-acc | + | vamm3 | ETH/MAR22 | vamm3-acc | + | vamm4 | ETH/MAR22 | vamm4-acc | + | vamm5 | ETH/MAR22 | vamm5-acc | + | vamm6 | ETH/MAR22 | vamm6-acc | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-acc | ACCOUNT_TYPE_GENERAL | | 1000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + | vamm2 | ACCOUNT_TYPE_GENERAL | vamm2-acc | ACCOUNT_TYPE_GENERAL | | 1000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + | vamm3 | ACCOUNT_TYPE_GENERAL | vamm3-acc | ACCOUNT_TYPE_GENERAL | | 1000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + | vamm4 | ACCOUNT_TYPE_GENERAL | vamm4-acc | ACCOUNT_TYPE_GENERAL | | 1000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + | vamm5 | ACCOUNT_TYPE_GENERAL | vamm5-acc | ACCOUNT_TYPE_GENERAL | | 1000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + | vamm6 | ACCOUNT_TYPE_GENERAL | vamm6-acc | ACCOUNT_TYPE_GENERAL | | 1000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + diff --git a/core/integration/features/amm/0087-VAMM-006-014.feature b/core/integration/features/amm/0087-VAMM-006-014.feature new file mode 100644 index 00000000000..1b62a15860e --- /dev/null +++ b/core/integration/features/amm/0087-VAMM-006-014.feature @@ -0,0 +1,490 @@ +Feature: Ensure the vAMM positions follow the market correctly + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.1 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | default-none | default-eth-for-future | 1e0 | 0 | SLA-22 | + + # Setting up the accounts and vAMM submission now is part of the background, because we'll be running scenarios 0087-VAMM-006 through 0087-VAMM-014 on this setup + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 1000000 | + | lp2 | USD | 1000000 | + | lp3 | USD | 1000000 | + | party1 | USD | 1000000 | + | party2 | USD | 1000000 | + | party3 | USD | 1000000 | + | party4 | USD | 1000000 | + | party5 | USD | 1000000 | + | vamm1 | USD | 1000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 600 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 400 | 0.015 | submission | + Then the network moves ahead "4" blocks + And the current epoch is "0" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/MAR22 | buy | 20 | 40 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | sell | 10 | 160 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 39 | 1000 | 1 | 100 | 100 | 100 | + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.1 | 100 | 85 | 150 | 0.25 | 0.25 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 85 | 150 | 0.25 | 0.25 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_GENERAL | | 100000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + + @VAMM + Scenario: 0087-VAMM-006: If other traders trade to move the market mid price to 140 the vAMM has a short position. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 265 | 141 | 1 | TYPE_LIMIT | TIF_GTC | + # see the trades that make the vAMM go short + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 118 | 265 | vamm1-id | true | + And the network moves ahead "1" blocks + # Check best offer/bid as this scenario matches 0087-VAMM-027: if other traders trade to move the market mid price to 140 quotes with a mid price of 140 (volume quotes above 140 should be sells, volume quotes below 140 should be buys). + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 118 | TRADING_MODE_CONTINUOUS | 140 | 140 | 141 | 139 | + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 265 | 0 | 0 | | + | vamm1-id | -265 | 0 | 0 | true | + + @VAMM + Scenario: 0087-VAMM-007: If other traders trade to move the market mid price to 90 the vAMM has a long position. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | sell | 350 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + # see the trades that make the vAMM go long + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 105 | 350 | party4 | true | + And the network moves ahead "1" blocks + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | + | 105 | TRADING_MODE_CONTINUOUS | 90 | 90 | # TODO why isn't this 90? + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | -350 | 0 | 0 | | + | vamm1-id | 350 | 0 | 0 | true | + + @VAMM + Scenario: 0087-VAMM-008: If other traders trade to move the market mid price to 150 the vAMM will post no further sell orders above this price, and the vAMM's position notional value will be equal to 4x its total account balance. + #When the network moves ahead "1" epochs + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 500 | 155 | 1 | TYPE_LIMIT | TIF_GTC | + # see the trades that make the vAMM go short + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 122 | 317 | vamm1-id | true | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 154 | 154 | 160 | 149 | + + # trying to trade again causes no trades because the AMM has no more volume + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 500 | 150 | 0 | TYPE_LIMIT | TIF_GTC | + + # the AMM's mid price has moved to 150, but it has no volume +150 so that best offer comes from the orderbook of 160 + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 154 | 154 | 160 | 149 | + + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 317 | 0 | 0 | | + | vamm1-id | -317 | 0 | 0 | true | + # Notional value therefore is 317 * 122 + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 122 | TRADING_MODE_CONTINUOUS | 154 | 154 | 160 | 149 | + + # vAMM receives fees, but loses out in the MTM settlement + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 155 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 81210 | USD | true | TRANSFER_TYPE_MARGIN_LOW | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | buy | 1 | 160 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party5 | 160 | 1 | lp1 | false | + + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 317 | 12046 | 0 | | + | party5 | 1 | 0 | 0 | | + | lp1 | -1 | 0 | 0 | | + | vamm1-id | -317 | -12046 | 0 | true | + # Notional value therefore is 317 * 122 + + @VAMM + Scenario: 0087-VAMM-009: If other traders trade to move the market mid price to 85 the vAMM will post no further buy orders below this price, and the vAMM's position notional value will be equal to 4x its total account balance. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | sell | 500 | 80 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 20033 | 1000 | 501 | 100 | 86 | 86 | 87 | 85 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 107 | 500 | party4 | true | + + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party1 | 1 | 7 | 0 | | + | party2 | -1 | -7 | 0 | | + | party4 | -500 | 0 | 0 | | + | vamm1-id | 500 | 0 | 0 | true | + # vAMM receives fees, but loses out in the MTM settlement + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 214 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 100214 | USD | true | TRANSFER_TYPE_MARGIN_LOW | + + # Now make sure we don't trade with vAMM below 85 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | sell | 10 | 75 | 0 | TYPE_LIMIT | TIF_GTC | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | ETH/MAR22 | buy | 10 | 75 | 1 | TYPE_LIMIT | TIF_GTC | + + # vAMM closes its position, but no more + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party3 | 75 | 10 | party4 | false | + When the network moves ahead "1" blocks + # position is zero for vamm1-id + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party1 | 1 | -25 | 0 | | + | party2 | -1 | 25 | 0 | | + | party3 | 10 | 0 | 0 | | + | party4 | -510 | 16000 | 0 | | + | vamm1-id | 500 | -16000 | 0 | true | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | + | 75 | TRADING_MODE_CONTINUOUS | 15325 | 1000 | 511 | 100 | 86 | 86 | 87 | 85 | + # TODO: vamm does not appear to have any notional. Neither party nor alias work. + #And the AMM "vamm1-id" has the following taker notional "4000" + #And the party "vamm1" has the following taker notional "4000" + + @VAMM + Scenario: 0087-VAMM-010: If other traders trade to move the market mid price to 110 and then trade to move the mid price back to 100 the vAMM will have a position of 0. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 81 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 3279 | 1000 | 82 | 100 | 111 | 111 | 112 | 110 | + # see the trades that make the vAMM go short + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 104 | 81 | vamm1-id | true | + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party1 | 1 | 4 | 0 | | + | party2 | -1 | -4 | 0 | | + | party4 | 81 | 0 | 0 | | + | vamm1-id | -81 | 0 | 0 | true | + # now return the price back to 100, vAMM should hold position of 0 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | ETH/MAR22 | sell | 81 | 100 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | + | 104 | TRADING_MODE_CONTINUOUS | 3410 | 1000 | 82 | 100 | 100 | 100 | 101 | 99 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 115 | 81 | party3 | true | + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party1 | 1 | 15 | 0 | | + | party2 | -1 | -15 | 0 | | + | party3 | -81 | 0 | 0 | | + | party4 | 81 | 891 | 0 | | + | vamm1-id | 0 | 0 | -891 | true | + + @VAMM + Scenario: 0087-VAMM-011: If other traders trade to move the market mid price to 90 and then trade to move the mid price back to 100 the vAMM will have a position of 0. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | ETH/MAR22 | sell | 340 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 13635 | 1000 | 341 | 100 | 90 | 90 | 91 | 89 | + # see the trades that make the vAMM go short + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 104 | 340 | party3 | true | + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party1 | 1 | 4 | 0 | | + | party2 | -1 | -4 | 0 | | + | party3 | -340 | 0 | 0 | | + | vamm1-id | 340 | 0 | 0 | true | + # move price back up to 100 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 340 | 100 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | + | 104 | TRADING_MODE_CONTINUOUS | 14181 | 1000 | 341 | 100 | 100 | 100 | 101 | 99 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 95 | 340 | vamm1-id | true | + + When the network moves ahead "1" blocks + # vAMM should not hold a position, but apparently it does, vAMM switched sides, this is a know bug with incoming fix + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party1 | 1 | -5 | 0 | | + | party2 | -1 | 5 | 0 | | + | party3 | -340 | 3060 | 0 | | + | party4 | 340 | 0 | 0 | | + | vamm1-id | 0 | 0 | -3060 | true | + + @VAMM + Scenario: 0087-VAMM-012: If other traders trade to move the market mid price to 90 and then in one trade move the mid price to 110 then trade to move the mid price back to 100 the vAMM will have a position of 0 + # Move mid price to 90 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | ETH/MAR22 | sell | 340 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 13635 | 1000 | 341 | 100 | 90 | 90 | 91 | 89 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 104 | 340 | party3 | true | + # Check vAMM position + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party1 | 1 | 4 | 0 | | + | party2 | -1 | -4 | 0 | | + | party3 | -340 | 0 | 0 | | + | vamm1-id | 340 | 0 | 0 | true | + + # In a single trade, move the mid privce to 110 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 420 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | + | 104 | TRADING_MODE_CONTINUOUS | 17508 | 1000 | 421 | 100 | 110 | 110 | 111 | 109 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 96 | 420 | vamm1-id | true | + # Check the resulting position, vAMM switched from long to short + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party1 | 1 | -4 | 0 | | + | party2 | -1 | 4 | 0 | | + | party3 | -340 | 2720 | 0 | | + | party4 | 420 | 0 | 0 | | + | vamm1-id | -80 | 0 | -2720 | true | + + # Now return the mid price back to 100 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | sell | 80 | 100 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | + | 96 | TRADING_MODE_CONTINUOUS | 16161 | 1000 | 421 | 100 | 100 | 100 | 101 | 99 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 115 | 80 | party5 | true | + # Check the resulting position, vAMM should hold 0 + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party1 | 1 | 15 | 0 | | + | party2 | -1 | -15 | 0 | | + | party3 | -340 | -3740 | 0 | | + | party4 | 420 | 7980 | 0 | | + | party5 | -80 | 0 | 0 | | + | vamm1-id | 0 | 0 | -4240 | true | + + @VAMM + Scenario: 0087-VAMM-013: If other traders trade to move the market mid price to 90 and then move the mid price back to 100 in several trades of varying size, the vAMM will have a position of 0. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | ETH/MAR22 | sell | 340 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 13635 | 1000 | 341 | 100 | 90 | 90 | 91 | 89 | + # see the trades that make the vAMM go short + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 104 | 340 | party3 | true | + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party1 | 1 | 4 | 0 | | + | party2 | -1 | -4 | 0 | | + | party3 | -340 | 0 | 0 | | + | vamm1-id | 340 | 0 | 0 | true | + # move price back up to 100, in several trades of varying sizes + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/MAR22 | buy | 99 | 100 | 1 | TYPE_LIMIT | TIF_GTC | + | party4 | ETH/MAR22 | buy | 121 | 100 | 1 | TYPE_LIMIT | TIF_GTC | + | party5 | ETH/MAR22 | buy | 120 | 100 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | + | 104 | TRADING_MODE_CONTINUOUS | 14181 | 1000 | 341 | 100 | 100 | 100 | 101 | 99 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party1 | 91 | 99 | vamm1-id | true | + | party4 | 94 | 121 | vamm1-id | true | + | party5 | 98 | 120 | vamm1-id | true | + + When the network moves ahead "1" blocks + # vAMM should not hold a position, but apparently it does, vAMM switched sides, this is a know bug with incoming fix + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party1 | 100 | 691 | 0 | | + | party2 | -1 | 2 | 0 | | + | party3 | -340 | 2040 | 0 | | + | party4 | 121 | 484 | 0 | | + | party5 | 120 | 0 | 0 | | + | vamm1-id | 0 | 0 | -3217 | true | + + @VAMM + Scenario: 0087-VAMM-014: If other traders trade to move the market mid price to 90 and then in one trade move the mid price to 110 then trade to move the mid price to 120 the vAMM will have a larger (more negative) but comparable position to if they had been moved straight from 100 to 120. + # Move mid price to 90 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | ETH/MAR22 | sell | 340 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 13635 | 1000 | 341 | 100 | 90 | 90 | 91 | 89 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 104 | 340 | party3 | true | + # Check vAMM position + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party1 | 1 | 4 | 0 | | + | party2 | -1 | -4 | 0 | | + | party3 | -340 | 0 | 0 | | + | vamm1-id | 340 | 0 | 0 | true | + + # In a single trade, move the mid privce to 110 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 420 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | + | 104 | TRADING_MODE_CONTINUOUS | 17508 | 1000 | 421 | 100 | 110 | 110 | 111 | 109 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 96 | 420 | vamm1-id | true | + # Check the resulting position, vAMM switched from long to short + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party1 | 1 | -4 | 0 | | + | party2 | -1 | 4 | 0 | | + | party3 | -340 | 2720 | 0 | | + | party4 | 420 | 0 | 0 | | + | vamm1-id | -80 | 0 | -2720 | true | + + # Now further increase the mid price, move it up to 120 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | buy | 65 | 120 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | + | 96 | TRADING_MODE_CONTINUOUS | 18656 | 1000 | 486 | 100 | 120 | 120 | 121 | 119 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party5 | 114 | 65 | vamm1-id | true | + # Check the resulting position, vAMM further increased their position + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party1 | 1 | 14 | 0 | | + | party2 | -1 | -14 | 0 | | + | party3 | -340 | -3400 | 0 | | + | party4 | 420 | 7560 | 0 | | + | party5 | 65 | 0 | 0 | | + | vamm1-id | -145 | -1440 | -2720 | true | diff --git a/core/integration/features/amm/0087-VAMM-015.feature b/core/integration/features/amm/0087-VAMM-015.feature new file mode 100644 index 00000000000..5485f4fd475 --- /dev/null +++ b/core/integration/features/amm/0087-VAMM-015.feature @@ -0,0 +1,117 @@ +Feature: Ensure the vAMM contributes to fee factor setting + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.1 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | default-none | default-eth-for-future | 1e0 | 0 | SLA-22 | + + # Setting up the accounts and vAMM submission now is part of the background, because we'll be running scenarios 0087-VAMM-006 through 0087-VAMM-014 on this setup + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 1000000 | + | lp2 | USD | 1000000 | + | lp3 | USD | 1000000 | + | party1 | USD | 1000000 | + | party2 | USD | 1000000 | + | party3 | USD | 1000000 | + | party4 | USD | 1000000 | + | party5 | USD | 1000000 | + | vamm1 | USD | 1000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 600 | 0.04 | submission | + | lp_2 | lp2 | ETH/MAR22 | 400 | 0.02 | submission | + Then the network moves ahead "4" blocks + And the current epoch is "0" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/MAR22 | buy | 20 | 40 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | sell | 10 | 160 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + | lp2 | ETH/MAR22 | buy | 500 | 80 | 0 | TYPE_LIMIT | TIF_GTC | lp2-s | + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 39 | 1000 | 1 | 100 | 120 | 120 | + + @VAMM + Scenario: 0087-VAMM-015: A vAMM which has been created and is active contributes with it's proposed fee level to the active fee setting mechanism. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | sell | 500 | 80 | 1 | TYPE_LIMIT | TIF_GTC | + + And the liquidity fee factor should be "0.02" for the market "ETH/MAR22" + + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 20033 | 1000 | 501 | 100 | 100 | 100 | 160 | 40 | + + When the network moves ahead "4" blocks + And the liquidity fee factor should be "0.04" for the market "ETH/MAR22" + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.1 | 80 | 65 | 130 | 0.25 | 0.25 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 80 | 65 | 130 | 0.25 | 0.25 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_GENERAL | | 100000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + + When the network moves ahead "4" blocks + And the liquidity fee factor should be "0.03" for the market "ETH/MAR22" diff --git a/core/integration/features/amm/0087-VAMM-016.feature b/core/integration/features/amm/0087-VAMM-016.feature new file mode 100644 index 00000000000..2233fa77113 --- /dev/null +++ b/core/integration/features/amm/0087-VAMM-016.feature @@ -0,0 +1,160 @@ +Feature: vAMM has the same ELS as liquidity provision with the same commitment amount + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 0.5 | 0.6 | 1.0 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | default-none | default-eth-for-future | 1e0 | 0 | SLA-22 | + + # Setting up the accounts and vAMM submission now is part of the background, because we'll be running scenarios 0087-VAMM-006 through 0087-VAMM-014 on this setup + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 1000000 | + | lp2 | USD | 1000000 | + | lp3 | USD | 1000000 | + | party1 | USD | 1000000 | + | party2 | USD | 1000000 | + | party3 | USD | 1000000 | + | party4 | USD | 1000000 | + | party5 | USD | 1000000 | + | vamm1 | USD | 1000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 10000 | 0.02 | submission | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/MAR22 | buy | 20 | 40 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | sell | 10 | 160 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + Then the network moves ahead "1" epochs + And the current epoch is "1" + + @VAMM + Scenario: 0087-VAMM-016: A vAMM's virtual ELS should be equal to the ELS of a regular LP with the same committed volume on the book (i.e. if a vAMM has an average volume on each side of the book across the epoch of 10k USDT, their ELS should be equal to that of a regular LP who has a commitment which requires supplying 10k USDT who joined at the same time as them). + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 39 | 10000 | 0 | 100 | 100 | 100 | + + When the parties submit the following liquidity provision: + # Using 10,093 instead of exactly 10,000 makes things easier because getting exactly 10,000 from an AMM pool as virtual stake can be tricky due to complex math. + | id | party | market id | commitment amount | fee | lp type | + | lp_2 | lp2 | ETH/MAR22 | 10093 | 0.03 | submission | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | proposed fee | + | vamm1 | ETH/MAR22 | 10000 | 0.8 | 100 | 95 | 105 | 0.96 | 0.96 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 10000 | STATUS_ACTIVE | 100 | 95 | 105 | 0.96 | 0.96 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_GENERAL | | 10000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + + Then the network moves ahead "1" epochs + And the current epoch is "2" + And the liquidity provider fee shares for the market "ETH/MAR22" should be: + | party | equity like share | virtual stake | average entry valuation | + | lp2 | 0.3343602994765785 | 10093.0000000000000000 | 30186 | + | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | 0.3343602994765785 | 10093.0000000000000000 | 20093 | + + @VAMM + Scenario: 0087-VAMM-017: A vAMM's virtual ELS should be equal to the ELS of a regular LP with the same committed volume on the book (i.e. if a vAMM has an average volume on each side of the book across the epoch of 10k USDT, their ELS should be equal to that of a regular LP who has a commitment which requires supplying 10k USDT who joined at the same time as them). + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 39 | 10000 | 0 | 100 | 100 | 100 | + + When the parties submit the following liquidity provision: + # Using 10,093 instead of exactly 10,000 makes things easier because getting exactly 10,000 from an AMM pool as virtual stake can be tricky due to complex math. + | id | party | market id | commitment amount | fee | lp type | + | lp_2 | lp2 | ETH/MAR22 | 10093 | 0.03 | submission | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp2 | ETH/MAR22 | buy | 1000 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + | lp2 | ETH/MAR22 | sell | 1000 | 100 | 0 | TYPE_LIMIT | TIF_GTC | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | proposed fee | + | vamm1 | ETH/MAR22 | 10000 | 0.8 | 100 | 95 | 105 | 0.96 | 0.96 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 10000 | STATUS_ACTIVE | 100 | 95 | 105 | 0.96 | 0.96 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_GENERAL | | 10000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + + Then the network moves ahead "1" epochs + And the current epoch is "2" + And the liquidity provider fee shares for the market "ETH/MAR22" should be: + | party | equity like share | virtual stake | average entry valuation | + | lp2 | 0.3343602994765785 | 10093.0000000000000000 | 30186 | + | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | 0.3343602994765785 | 10093.0000000000000000 | 20093 | + + Then the network moves ahead "2" epochs + And the current epoch is "4" + + And the liquidity provider fee shares for the market "ETH/MAR22" should be: + | party | equity like share | average entry valuation | + | lp2 | 0.3343602994765785 | 30186 | + | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | 0.3343602994765785 | 20093 | \ No newline at end of file diff --git a/core/integration/features/amm/0087-VAMM-019.feature b/core/integration/features/amm/0087-VAMM-019.feature new file mode 100644 index 00000000000..d18f1fd3658 --- /dev/null +++ b/core/integration/features/amm/0087-VAMM-019.feature @@ -0,0 +1,158 @@ +Feature: Test vAMM cancellation by abandoning. + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.1 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | default-none | default-eth-for-future | 1e0 | 0 | SLA-22 | + + # Setting up the accounts and vAMM submission now is part of the background, because we'll be running scenarios 0087-VAMM-006 through 0087-VAMM-014 on this setup + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 1000000 | + | lp2 | USD | 1000000 | + | lp3 | USD | 1000000 | + | party1 | USD | 1000000 | + | party2 | USD | 1000000 | + | party3 | USD | 1000000 | + | party4 | USD | 1000000 | + | party5 | USD | 1000000 | + | vamm1 | USD | 1000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 600 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 400 | 0.015 | submission | + Then the network moves ahead "4" blocks + And the current epoch is "0" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/MAR22 | buy | 20 | 40 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | sell | 10 | 160 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 39 | 1000 | 1 | 100 | 100 | 100 | + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.1 | 100 | 85 | 150 | 0.25 | 0.25 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 85 | 150 | 0.25 | 0.25 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_GENERAL | | 100000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + + + @VAMM + Scenario: 0087-VAMM-019: If a vAMM is cancelled with Abandon Position then it is closed immediately. All funds which were in the general account of the vAMM are returned to the user who created the vAMM and the remaining position and margin funds are moved to the network to close out as it would a regular defaulted position. + # based on 0087-VAMM-008: vAMM creates a position, has some general balance left in general and margin accounts. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 500 | 155 | 1 | TYPE_LIMIT | TIF_GTC | + # see the trades that make the vAMM go short + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 122 | 317 | vamm1-id | true | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 154 | 154 | 160 | 149 | + + # trying to trade again causes no trades because the AMM has no more volume + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 500 | 150 | 0 | TYPE_LIMIT | TIF_GTC | + + # the AMM's mid price has moved to 150, but it has no volume +150 so that best offer comes from the orderbook of 160 + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 154 | 154 | 160 | 149 | + + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 317 | 0 | 0 | | + | vamm1-id | -317 | 0 | 0 | true | + # Notional value therefore is 317 * 122 + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 122 | TRADING_MODE_CONTINUOUS | 154 | 154 | 160 | 149 | + + # vAMM receives fees, but loses out in the MTM settlement + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 155 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 81210 | USD | true | TRANSFER_TYPE_MARGIN_LOW | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 900000 | | | + | vamm1-id | USD | ETH/MAR22 | 18945 | 81210 | true | + + # Immediate cancellation: return vAMM general balance back to the party, margin is confiscated. + When the parties cancel the following AMM: + | party | market id | method | + | vamm1 | ETH/MAR22 | METHOD_IMMEDIATE | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 100000 | STATUS_CANCELLED | 100 | 85 | 150 | 0.25 | 0.25 | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 918945 | | | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1 | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 18945 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_RELEASE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_INSURANCE | ETH/MAR22 | 81210 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_RELEASE | + diff --git a/core/integration/features/amm/0087-VAMM-020.feature b/core/integration/features/amm/0087-VAMM-020.feature new file mode 100644 index 00000000000..5abf0bb1bfe --- /dev/null +++ b/core/integration/features/amm/0087-VAMM-020.feature @@ -0,0 +1,361 @@ +Feature: Test vAMM cancellation by reduce-only from long. + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.1 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | default-none | default-eth-for-future | 1e0 | 0 | SLA-22 | + + # Setting up the accounts and vAMM submission now is part of the background, because we'll be running scenarios 0087-VAMM-006 through 0087-VAMM-014 on this setup + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 1000000 | + | lp2 | USD | 1000000 | + | lp3 | USD | 1000000 | + | party1 | USD | 1000000 | + | party2 | USD | 1000000 | + | party3 | USD | 1000000 | + | party4 | USD | 1000000 | + | party5 | USD | 1000000 | + | vamm1 | USD | 1000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 600 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 400 | 0.015 | submission | + Then the network moves ahead "4" blocks + And the current epoch is "0" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/MAR22 | buy | 20 | 40 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | sell | 10 | 160 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 39 | 1000 | 1 | 100 | 100 | 100 | + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.1 | 100 | 85 | 150 | 0.25 | 0.25 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 85 | 150 | 0.25 | 0.25 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_GENERAL | | 100000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + + + @VAMM + Scenario: 0087-VAMM-020: If a vAMM is cancelled and set in Reduce-Only mode when it is currently long, then It creates no further buy orders even if the current price is above the configured lower price. When one of it's sell orders is executed it still does not produce buy orders, and correctly quotes sell orders from a higher price. When the position reaches 0 the vAMM is closed and all funds are released to the user after the next mark to market. + # based on 0087-VAMM-007 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | sell | 350 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + # see the trades that make the vAMM go long + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 105 | 350 | party4 | true | + And the network moves ahead "1" blocks + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | + | 105 | TRADING_MODE_CONTINUOUS | 90 | 90 | + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | -350 | 0 | 0 | | + | vamm1-id | 350 | 0 | 0 | true | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 147 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 71247 | USD | true | TRANSFER_TYPE_MARGIN_LOW | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 900000 | | | + | vamm1-id | USD | ETH/MAR22 | 28900 | 71247 | true | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 105 | TRADING_MODE_CONTINUOUS | 90 | 90 | 91 | 89 | + + # Next: cancel the vAMM with reduce-only + When the parties cancel the following AMM: + | party | market id | method | + | vamm1 | ETH/MAR22 | METHOD_REDUCE_ONLY | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 100000 | STATUS_REDUCE_ONLY | 100 | 85 | 150 | 0.25 | 0.25 | + # Check if the vAMM doesn't place any more buy orders: submit sell orders at previous best bid, ask, and mid prices: + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | sell | 10 | 89 | 0 | TYPE_LIMIT | TIF_GTC | + | party4 | ETH/MAR22 | sell | 10 | 90 | 0 | TYPE_LIMIT | TIF_GTC | + | party4 | ETH/MAR22 | sell | 10 | 91 | 0 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 105 | TRADING_MODE_CONTINUOUS | 65 | 65 | 91 | 40 | + + # Now start checking if the vAMM still quotes sell orders + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | buy | 280 | 110 | 4 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party5 | 89 | 10 | party4 | | + | party5 | 90 | 10 | party4 | | + | party5 | 91 | 10 | party4 | | + | party5 | 93 | 250 | vamm1-id | true | + + # check the state of the market, trigger MTM settlement and check balances before closing out the last 100 for the vAMM + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | -380 | 4110 | 0 | | + | party5 | 280 | 90 | 0 | | + | vamm1-id | 100 | -1200 | -3000 | true | + # vAMM is still quoting bid price, though it is in reduce-only mode, and therefore doesn't place those orders. + # The best bid should be 40 here? + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 93 | TRADING_MODE_CONTINUOUS | 69 | 69 | 98 | 40 | + # vAMM receives some fees, but pays MTM loss, excess margin is released + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 93 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 4200 | USD | true | TRANSFER_TYPE_MTM_LOSS | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 49017 | USD | true | TRANSFER_TYPE_MARGIN_HIGH | + # After receiving fees, and excess margin is correctly released, the balances of the vAMM sub-accounts match the position: + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 900000 | | | + | vamm1-id | USD | ETH/MAR22 | 78010 | 18030 | true | + + # Now make sure the vAMM, though clearly having sufficient balance to increase its position, still doesn't place any buy orders (reduce only check 2) + # Like before, place orders at mid, offer, and bid prices + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party4 | ETH/MAR22 | sell | 10 | 96 | 0 | TYPE_LIMIT | TIF_GTC | p4-c1 | + | party4 | ETH/MAR22 | sell | 10 | 97 | 0 | TYPE_LIMIT | TIF_GTC | p4-c2 | + | party4 | ETH/MAR22 | sell | 10 | 98 | 0 | TYPE_LIMIT | TIF_GTC | p4-c3 | + # we've confirmed the vAMM does not reduce its position at all, so cancel these orders to keep things simple + Then the parties cancel the following orders: + | party | reference | + | party4 | p4-c1 | + | party4 | p4-c2 | + | party4 | p4-c3 | + # party5 places a buy order large enough to trade with party4 and reduce the vAMM position down to 0, and no more. + # we'll do a v2 of this test where this buy order is "over-sized" to ensure the vAMM doesn't flip from long to short. + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | buy | 100 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party5 | 98 | 100 | vamm1-id | true | + # Confirm the vAMM is no longer quoting anything + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 93 | TRADING_MODE_CONTINUOUS | 100 | 100 | 160 | 40 | + + # Check the final PnL for the vAMM, check the transfers and balances + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | -380 | 2210 | 0 | | + | party5 | 380 | 1490 | 0 | | + | vamm1-id | 0 | 0 | -3700 | true | + And the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 100000 | STATUS_CANCELLED | 100 | 85 | 150 | 0.25 | 0.25 | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 98 | TRADING_MODE_CONTINUOUS | 100 | 100 | 160 | 40 | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 40 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | | ACCOUNT_TYPE_SETTLEMENT | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 500 | USD | true | TRANSFER_TYPE_MTM_WIN | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 18530 | USD | true | TRANSFER_TYPE_MARGIN_HIGH | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1 | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 96580 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_RELEASE | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 996580 | | | + | vamm1-id | USD | ETH/MAR22 | 0 | 0 | true | + + @VAMM + Scenario: 0087-VAMM-020: Same as the test above, only the final buy order that moves the vAMM position to 0 is more than big enough, and doesn't cause the vAMM to flip position from long to short. + # based on 0087-VAMM-007 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | sell | 350 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + # see the trades that make the vAMM go long + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 105 | 350 | party4 | true | + And the network moves ahead "1" blocks + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | + | 105 | TRADING_MODE_CONTINUOUS | 90 | 90 | + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | -350 | 0 | 0 | | + | vamm1-id | 350 | 0 | 0 | true | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 147 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 71247 | USD | true | TRANSFER_TYPE_MARGIN_LOW | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 900000 | | | + | vamm1-id | USD | ETH/MAR22 | 28900 | 71247 | true | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 105 | TRADING_MODE_CONTINUOUS | 90 | 90 | 91 | 89 | + + # Next: cancel the vAMM with reduce-only + When the parties cancel the following AMM: + | party | market id | method | + | vamm1 | ETH/MAR22 | METHOD_REDUCE_ONLY | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 100000 | STATUS_REDUCE_ONLY | 100 | 85 | 150 | 0.25 | 0.25 | + # Check if the vAMM doesn't place any more buy orders: submit sell orders at previous best bid, ask, and mid prices: + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | sell | 10 | 89 | 0 | TYPE_LIMIT | TIF_GTC | + | party4 | ETH/MAR22 | sell | 10 | 90 | 0 | TYPE_LIMIT | TIF_GTC | + | party4 | ETH/MAR22 | sell | 10 | 91 | 0 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 105 | TRADING_MODE_CONTINUOUS | 65 | 65 | 91 | 40 | + + # Now start checking if the vAMM still quotes sell orders + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | buy | 280 | 110 | 4 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party5 | 89 | 10 | party4 | | + | party5 | 90 | 10 | party4 | | + | party5 | 91 | 10 | party4 | | + | party5 | 93 | 250 | vamm1-id | true | + + # check the state of the market, trigger MTM settlement and check balances before closing out the last 100 for the vAMM + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | -380 | 4110 | 0 | | + | party5 | 280 | 90 | 0 | | + | vamm1-id | 100 | -1200 | -3000 | true | + # vAMM is still quoting bid price, though it is in reduce-only mode, and therefore doesn't place those orders. + # The best bid should be 40 here? + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 93 | TRADING_MODE_CONTINUOUS | 69 | 69 | 98 | 40 | + # vAMM receives some fees, but pays MTM loss, excess margin is released + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 93 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 4200 | USD | true | TRANSFER_TYPE_MTM_LOSS | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 49017 | USD | true | TRANSFER_TYPE_MARGIN_HIGH | + # After receiving fees, and excess margin is correctly released, the balances of the vAMM sub-accounts match the position: + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 900000 | | | + | vamm1-id | USD | ETH/MAR22 | 78010 | 18030 | true | + + # Now make sure the vAMM, though clearly having sufficient balance to increase its position, still doesn't place any buy orders (reduce only check 2) + # Like before, place orders at mid, offer, and bid prices + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party4 | ETH/MAR22 | sell | 10 | 96 | 0 | TYPE_LIMIT | TIF_GTC | p4-c1 | + | party4 | ETH/MAR22 | sell | 10 | 97 | 0 | TYPE_LIMIT | TIF_GTC | p4-c2 | + | party4 | ETH/MAR22 | sell | 10 | 98 | 0 | TYPE_LIMIT | TIF_GTC | p4-c3 | + # we've confirmed the vAMM does not reduce its position at all, so cancel these orders to keep things simple + Then the parties cancel the following orders: + | party | reference | + | party4 | p4-c1 | + | party4 | p4-c2 | + | party4 | p4-c3 | + # party5 places a buy order large enough to trade with party4 and reduce the vAMM position down to 0, and more, vAMM does not trade to move from long to short, it stays at 0. + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | buy | 150 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party5 | 98 | 100 | vamm1-id | true | + # Confirm the vAMM is no longer quoting anything + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 93 | TRADING_MODE_CONTINUOUS | 135 | 135 | 160 | 110 | + + # Check the final PnL for the vAMM, check the transfers and balances + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | -380 | 2210 | 0 | | + | party5 | 380 | 1490 | 0 | | + | vamm1-id | 0 | 0 | -3700 | true | + And the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 100000 | STATUS_CANCELLED | 100 | 85 | 150 | 0.25 | 0.25 | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 98 | TRADING_MODE_CONTINUOUS | 135 | 135 | 160 | 110 | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 40 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | | ACCOUNT_TYPE_SETTLEMENT | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 500 | USD | true | TRANSFER_TYPE_MTM_WIN | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 18530 | USD | true | TRANSFER_TYPE_MARGIN_HIGH | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1 | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 96580 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_RELEASE | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 996580 | | | + | vamm1-id | USD | ETH/MAR22 | 0 | 0 | true | diff --git a/core/integration/features/amm/0087-VAMM-021.feature b/core/integration/features/amm/0087-VAMM-021.feature new file mode 100644 index 00000000000..5ada941924a --- /dev/null +++ b/core/integration/features/amm/0087-VAMM-021.feature @@ -0,0 +1,406 @@ +Feature: Test vAMM cancellation by reduce-only from short. + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.1 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | default-none | default-eth-for-future | 1e0 | 0 | SLA-22 | + + # Setting up the accounts and vAMM submission now is part of the background, because we'll be running scenarios 0087-VAMM-006 through 0087-VAMM-014 on this setup + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 1000000 | + | lp2 | USD | 1000000 | + | lp3 | USD | 1000000 | + | party1 | USD | 1000000 | + | party2 | USD | 1000000 | + | party3 | USD | 1000000 | + | party4 | USD | 1000000 | + | party5 | USD | 1000000 | + | vamm1 | USD | 1000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 600 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 400 | 0.015 | submission | + Then the network moves ahead "4" blocks + And the current epoch is "0" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/MAR22 | buy | 20 | 40 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | sell | 10 | 160 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 39 | 1000 | 1 | 100 | 100 | 100 | + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.1 | 100 | 85 | 150 | 0.25 | 0.25 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 85 | 150 | 0.25 | 0.25 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_GENERAL | | 100000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + + + @VAMM + Scenario: 0087-VAMM-021: If a vAMM is cancelled and set in Reduce-Only mode when it is currently short, then it creates no further sell orders even if the current price is below the configured upper price. When one of it's buy orders is executed it still does not produce sell orders, and correctly quotes buy orders from a lower price. When the position reaches 0 the vAMM is closed and all funds are released to the user after the next mark to market. + # based on 0087-VAMM-008: vAMM creates a position, has some general balance left in general and margin accounts. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party4 | ETH/MAR22 | buy | 500 | 155 | 1 | TYPE_LIMIT | TIF_GTC | p4-first | + # see the trades that make the vAMM go short + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 122 | 317 | vamm1-id | true | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 154 | 154 | 160 | 149 | + + # trying to trade again causes no trades because the AMM has no more volume + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party4 | ETH/MAR22 | buy | 500 | 150 | 0 | TYPE_LIMIT | TIF_GTC | p4-second | + + # the AMM's mid price has moved to 150, but it has no volume +150 so that best offer comes from the orderbook of 160 + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 154 | 154 | 160 | 149 | + + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 317 | 0 | 0 | | + | vamm1-id | -317 | 0 | 0 | true | + # Notional value therefore is 317 * 122 + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 122 | TRADING_MODE_CONTINUOUS | 154 | 154 | 160 | 149 | + + # vAMM receives fees, but loses out in the MTM settlement + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 155 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 81210 | USD | true | TRANSFER_TYPE_MARGIN_LOW | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 900000 | | | + | vamm1-id | USD | ETH/MAR22 | 18945 | 81210 | true | + + # Immediate cancellation: return vAMM general balance back to the party, margin is confiscated. + When the parties cancel the following AMM: + | party | market id | method | + | vamm1 | ETH/MAR22 | METHOD_REDUCE_ONLY | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 100000 | STATUS_REDUCE_ONLY | 100 | 85 | 150 | 0.25 | 0.25 | + # Cancel the remaining order from the start of the test + When the parties cancel the following orders: + | party | reference | + | party4 | p4-first | + | party4 | p4-second | + # Ensure the vAMM cancellation works as expected: a short position shot not increase. + # Place buy orders at mid price, current mark price, and best bid. + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 10 | 122 | 0 | TYPE_LIMIT | TIF_GTC | + | party4 | ETH/MAR22 | buy | 10 | 149 | 0 | TYPE_LIMIT | TIF_GTC | + | party4 | ETH/MAR22 | buy | 10 | 154 | 0 | TYPE_LIMIT | TIF_GTC | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 122 | TRADING_MODE_CONTINUOUS | 154 | 154 | 160 | 149 | + + # Now bring in another party that will trade with the buy orders we've just placed, and reduce the exposure of the vAMM + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | sell | 350 | 122 | 4 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 154 | 10 | party5 | | + | party4 | 149 | 10 | party5 | | + | party4 | 122 | 10 | party5 | | + | vamm1-id | 167 | 149 | party5 | true | + + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 347 | -590 | 0 | | + | party5 | -179 | 7295 | 0 | | + | vamm1-id | -168 | 0 | -6705 | true | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 100 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 6705 | USD | true | TRANSFER_TYPE_MTM_LOSS | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 31466 | USD | true | TRANSFER_TYPE_MARGIN_HIGH | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 900000 | | | + | vamm1-id | USD | ETH/MAR22 | 50511 | 43039 | true | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 122 | TRADING_MODE_CONTINUOUS | 123 | 123 | 122 | 125 | + + # Cool, now close the position of vamm completely + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | sell | 40 | 115 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 128 | 40 | party5 | true | + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 347 | 1492 | 0 | | + | party5 | -219 | 6221 | 0 | | + | vamm1-id | -128 | -768 | -6945 | true | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 21 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 1008 | USD | true | TRANSFER_TYPE_MTM_LOSS | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 7627 | USD | true | TRANSFER_TYPE_MARGIN_HIGH | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 900000 | | | + | vamm1-id | USD | ETH/MAR22 | 58159 | 34404 | true | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 128 | TRADING_MODE_CONTINUOUS | 120 | 120 | 122 | 119 | + + # OK, zero-out the vAMM + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | sell | 128 | 100 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 130 | 128 | party5 | true | + + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 347 | 2186 | 0 | | + | party5 | -347 | 5783 | 0 | | + | vamm1-id | 0 | 0 | -7969 | true | + And the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 100000 | STATUS_CANCELLED | 100 | 85 | 150 | 0.25 | 0.25 | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 67 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 256 | USD | true | TRANSFER_TYPE_MTM_LOSS | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 34148 | USD | true | TRANSFER_TYPE_MARGIN_HIGH | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1 | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 92374 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_RELEASE | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 992374 | | | + | vamm1-id | USD | ETH/MAR22 | 0 | 0 | true | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 130 | TRADING_MODE_CONTINUOUS | 81 | 81 | 122 | 40 | + + @VAMM + Scenario: 0087-VAMM-021: Same as the test above, only this time, the final order that closes the vAMM position is bigger than the remaining volume, so we check if the vAMM is cancelled instead of going long. + # based on 0087-VAMM-008: vAMM creates a position, has some general balance left in general and margin accounts. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party4 | ETH/MAR22 | buy | 500 | 155 | 1 | TYPE_LIMIT | TIF_GTC | p4-first | + # see the trades that make the vAMM go short + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 122 | 317 | vamm1-id | true | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 154 | 154 | 160 | 149 | + + # trying to trade again causes no trades because the AMM has no more volume + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party4 | ETH/MAR22 | buy | 500 | 150 | 0 | TYPE_LIMIT | TIF_GTC | p4-second | + + # the AMM's mid price has moved to 150, but it has no volume +150 so that best offer comes from the orderbook of 160 + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 154 | 154 | 160 | 149 | + + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 317 | 0 | 0 | | + | vamm1-id | -317 | 0 | 0 | true | + # Notional value therefore is 317 * 122 + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 122 | TRADING_MODE_CONTINUOUS | 154 | 154 | 160 | 149 | + + # vAMM receives fees, but loses out in the MTM settlement + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 155 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 81210 | USD | true | TRANSFER_TYPE_MARGIN_LOW | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 900000 | | | + | vamm1-id | USD | ETH/MAR22 | 18945 | 81210 | true | + + # Immediate cancellation: return vAMM general balance back to the party, margin is confiscated. + When the parties cancel the following AMM: + | party | market id | method | + | vamm1 | ETH/MAR22 | METHOD_REDUCE_ONLY | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 100000 | STATUS_REDUCE_ONLY | 100 | 85 | 150 | 0.25 | 0.25 | + # Cancel the remaining order from the start of the test + When the parties cancel the following orders: + | party | reference | + | party4 | p4-first | + | party4 | p4-second | + # Ensure the vAMM cancellation works as expected: a short position shot not increase. + # Place buy orders at mid price, current mark price, and best bid. + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 10 | 122 | 0 | TYPE_LIMIT | TIF_GTC | + | party4 | ETH/MAR22 | buy | 10 | 149 | 0 | TYPE_LIMIT | TIF_GTC | + | party4 | ETH/MAR22 | buy | 10 | 154 | 0 | TYPE_LIMIT | TIF_GTC | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 122 | TRADING_MODE_CONTINUOUS | 154 | 154 | 160 | 149 | + + # Now bring in another party that will trade with the buy orders we've just placed, and reduce the exposure of the vAMM + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | sell | 350 | 122 | 4 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 154 | 10 | party5 | | + | party4 | 149 | 10 | party5 | | + | party4 | 122 | 10 | party5 | | + | vamm1-id | 167 | 149 | party5 | true | + + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 347 | -590 | 0 | | + | party5 | -179 | 7295 | 0 | | + | vamm1-id | -168 | 0 | -6705 | true | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 100 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 6705 | USD | true | TRANSFER_TYPE_MTM_LOSS | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 31466 | USD | true | TRANSFER_TYPE_MARGIN_HIGH | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 900000 | | | + | vamm1-id | USD | ETH/MAR22 | 50511 | 43039 | true | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 122 | TRADING_MODE_CONTINUOUS | 123 | 123 | 122 | 125 | + + # Cool, now close the position of vamm completely + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | sell | 40 | 115 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 128 | 40 | party5 | true | + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 347 | 1492 | 0 | | + | party5 | -219 | 6221 | 0 | | + | vamm1-id | -128 | -768 | -6945 | true | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 21 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 1008 | USD | true | TRANSFER_TYPE_MTM_LOSS | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 7627 | USD | true | TRANSFER_TYPE_MARGIN_HIGH | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 900000 | | | + | vamm1-id | USD | ETH/MAR22 | 58159 | 34404 | true | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 128 | TRADING_MODE_CONTINUOUS | 120 | 120 | 122 | 119 | + + # OK, zero-out the vAMM + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | sell | 130 | 100 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 130 | 128 | party5 | true | + + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 347 | 2186 | 0 | | + | party5 | -347 | 5783 | 0 | | + | vamm1-id | 0 | 0 | -7969 | true | + And the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 100000 | STATUS_CANCELLED | 100 | 85 | 150 | 0.25 | 0.25 | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 67 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 256 | USD | true | TRANSFER_TYPE_MTM_LOSS | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 34148 | USD | true | TRANSFER_TYPE_MARGIN_HIGH | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1 | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 92374 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_RELEASE | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 992374 | | | + | vamm1-id | USD | ETH/MAR22 | 0 | 0 | true | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 130 | TRADING_MODE_CONTINUOUS | 70 | 70 | 100 | 40 | diff --git a/core/integration/features/amm/0087-VAMM-022.feature b/core/integration/features/amm/0087-VAMM-022.feature new file mode 100644 index 00000000000..a0686d02703 --- /dev/null +++ b/core/integration/features/amm/0087-VAMM-022.feature @@ -0,0 +1,141 @@ +Feature: Test vAMM cancellation without position works as expected. + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.1 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + And the price monitoring named "price-monitoring": + | horizon | probability | auction extension | + | 3600 | 0.95 | 3 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | price-monitoring | default-eth-for-future | 1e0 | 0 | SLA-22 | + + @VAMM + Scenario: 0087-VAMM-022: If a vAMM is cancelled and set in Reduce-Only mode when it currently has no position then all funds are released after the next mark to market. + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 100000 | + | lp2 | USD | 100000 | + | lp3 | USD | 100000 | + | party1 | USD | 100000 | + | party2 | USD | 100000 | + | party3 | USD | 100000 | + | vamm1 | USD | 1000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 600 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 400 | 0.015 | submission | + Then the network moves ahead "4" blocks + And the current epoch is "0" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party3 | ETH/MAR22 | buy | 10 | 85 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | buy | 10 | 90 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 10 | 110 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party3 | ETH/MAR22 | sell | 1 | 120 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | buy | 10 | 95 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | lp1 | ETH/MAR22 | sell | 10 | 106 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 3600 | 94 | 106 | 39 | 1000 | 1 | 100 | 100 | 100 | + + # trade to move the mark price to 105 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 10 | 105 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 10 | 105 | 1 | TYPE_LIMIT | TIF_GTC | | + + # Now submit our vAMM, no trades should happen + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.1 | 100 | 85 | 150 | 0.25 | 0.25 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 85 | 150 | 0.25 | 0.25 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-acc | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-acc | ACCOUNT_TYPE_GENERAL | | 1000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 0 | | | + | vamm1-acc | USD | ETH/MAR22 | 1000 | | true | + + # Now cancel with reduce-only + When the parties cancel the following AMM: + | party | market id | method | + | vamm1 | ETH/MAR22 | METHOD_REDUCE_ONLY | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_REDUCE_ONLY | 100 | 85 | 150 | 0.25 | 0.25 | + # Balance is not yet released + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 0 | | | + | vamm1-acc | USD | ETH/MAR22 | 1000 | | true | + + # Now trigger a MTM settlement, this is when we see the status updated to cancelled and the funds get released. + When the network moves ahead "1" blocks + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_CANCELLED | 100 | 85 | 150 | 0.25 | 0.25 | + Then the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1-acc | ACCOUNT_TYPE_GENERAL | vamm1 | ACCOUNT_TYPE_GENERAL | | 1000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_RELEASE | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 1000 | | | + | vamm1-acc | USD | ETH/MAR22 | 0 | | true | diff --git a/core/integration/features/amm/0087-VAMM-023.feature b/core/integration/features/amm/0087-VAMM-023.feature new file mode 100644 index 00000000000..25124a1b557 --- /dev/null +++ b/core/integration/features/amm/0087-VAMM-023.feature @@ -0,0 +1,150 @@ +Feature: Test cancelled vAMM becomes active on amend. + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.1 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + And the price monitoring named "price-monitoring": + | horizon | probability | auction extension | + | 3600 | 0.95 | 3 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | price-monitoring | default-eth-for-future | 1e0 | 0 | SLA-22 | + + @VAMM + Scenario: 0087-VAMM-023: If a vAMM is cancelled and set into Reduce-Only mode, then an amend is sent by the user who created it, the vAMM is amended according to those instructions and is moved out of Reduce-Only mode back into normal operation. + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 100000 | + | lp2 | USD | 100000 | + | lp3 | USD | 100000 | + | party1 | USD | 100000 | + | party2 | USD | 100000 | + | party3 | USD | 100000 | + | vamm1 | USD | 1000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 600 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 400 | 0.015 | submission | + Then the network moves ahead "4" blocks + And the current epoch is "0" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party3 | ETH/MAR22 | buy | 10 | 85 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | buy | 10 | 90 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 10 | 110 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party3 | ETH/MAR22 | sell | 1 | 120 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | buy | 10 | 95 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | lp1 | ETH/MAR22 | sell | 10 | 106 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 39 | 1000 | 1 | 100 | 100 | 100 | + + # trade to move the mark price to 105 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 10 | 105 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 10 | 105 | 1 | TYPE_LIMIT | TIF_GTC | | + + # Now submit our vAMM, no trades should happen + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.1 | 100 | 85 | 150 | 0.25 | 0.25 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 85 | 150 | 0.25 | 0.25 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-acc | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-acc | ACCOUNT_TYPE_GENERAL | | 1000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 0 | | | + | vamm1-acc | USD | ETH/MAR22 | 1000 | | true | + + # Now cancel with reduce-only + When the parties cancel the following AMM: + | party | market id | method | + | vamm1 | ETH/MAR22 | METHOD_REDUCE_ONLY | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_REDUCE_ONLY | 100 | 85 | 150 | 0.25 | 0.25 | + # Balance is not yet released + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 0 | | | + | vamm1-acc | USD | ETH/MAR22 | 1000 | | true | + + # Now amend the reduce-only vAMM submission, and check to see if its status returns back to active + When the parties amend the following AMM: + | party | market id | slippage | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 0.1 | 105 | 90 | 155 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 105 | 90 | 155 | 0.25 | 0.25 | + + # Now trigger a MTM settlement, this should not change anything, whereas without the amend it'd move the vAMM to the cancelled status. + When the network moves ahead "1" blocks + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 105 | 90 | 155 | 0.25 | 0.25 | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 0 | | | + | vamm1-acc | USD | ETH/MAR22 | 1000 | | true | + # The mark price has now moved to 105 + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 105 | TRADING_MODE_CONTINUOUS | 461 | 1000 | 11 | 104 | 100 | 100 | diff --git a/core/integration/features/amm/0087-VAMM-024-026.feature b/core/integration/features/amm/0087-VAMM-024-026.feature new file mode 100644 index 00000000000..8304f1fac0f --- /dev/null +++ b/core/integration/features/amm/0087-VAMM-024-026.feature @@ -0,0 +1,204 @@ +Feature: When market.amm.minCommitmentQuantum is 1000, mid price of the market 100, and a user with 1000 USDT creates a vAMM with commitment 1000, base price 100, upper price 150, lower price 85 and leverage ratio at each bound 0.25 + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1000 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.1 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | default-none | default-eth-for-future | 1e0 | 0 | SLA-22 | + + # Setting up the accounts and vAMM submission now is part of the background, because we'll be running scenarios 0087-VAMM-006 through 0087-VAMM-014 on this setup + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 1000000 | + | lp2 | USD | 1000000 | + | lp3 | USD | 1000000 | + | party1 | USD | 1000000 | + | party2 | USD | 1000000 | + | party3 | USD | 1000000 | + | party4 | USD | 1000000 | + | party5 | USD | 1000000 | + | vamm1 | USD | 10000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 600 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 400 | 0.015 | submission | + Then the network moves ahead "4" blocks + And the current epoch is "0" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/MAR22 | buy | 20 | 40 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | sell | 10 | 160 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 39 | 1000 | 1 | 100 | 100 | 100 | + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.1 | 100 | 85 | 150 | 0.25 | 0.25 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 85 | 150 | 0.25 | 0.25 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_GENERAL | | 1000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + + @VAMM + Scenario: 0087-VAMM-024: If other traders trade to move the market mid price to 140 the vAMM has a short position. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 4 | 120 | 1 | TYPE_LIMIT | TIF_GTC | + # see the trades that make the vAMM go short + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 113 | 2 | vamm1-id | true | + + When the network moves ahead "1" blocks + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | + | 113 | TRADING_MODE_CONTINUOUS | 140 | 140 | + And the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 2 | 0 | 0 | | + | vamm1-id | -2 | 0 | 0 | true | + And the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 85 | 150 | 0.25 | 0.25 | + + @VAMM + Scenario: 0087-VAMM-025: If the vAMM is then amended such that it has a new base price of 140 it should attempt to place a trade to rebalance it's position to 0 at a mid price of 140. If that trade can execute with the slippage as configured in the request then the transaction is accepted. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 4 | 120 | 1 | TYPE_LIMIT | TIF_GTC | + # see the trades that make the vAMM go short + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 113 | 2 | vamm1-id | true | + + When the network moves ahead "1" blocks + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | + | 113 | TRADING_MODE_CONTINUOUS | 140 | 140 | + And the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 2 | 0 | 0 | | + | vamm1-id | -2 | 0 | 0 | true | + And the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 85 | 150 | 0.25 | 0.25 | + + # Now amend the vAMM in a way that gets accepted. + When the parties amend the following AMM: + | party | market id | slippage | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 0.5 | 140 | 90 | 155 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 140 | 90 | 155 | 0.25 | 0.25 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | sell | 2 | 140 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 154 | 2 | party5 | true | + # ensure the vamm closed its position + When the network moves ahead "1" blocks + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | + | 154 | TRADING_MODE_CONTINUOUS | 130 | 130 | + And the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 2 | 82 | 0 | | + | party5 | -2 | 0 | 0 | | + | vamm1-id | 0 | 0 | -82 | true | + + @VAMM + Scenario: 0087-VAMM-026: If the trade cannot execute with the slippage as configured in the request then the transaction is rejected and no changes to the vAMM are made. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 4 | 120 | 1 | TYPE_LIMIT | TIF_GTC | + # see the trades that make the vAMM go short + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 113 | 2 | vamm1-id | true | + + When the network moves ahead "1" blocks + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | + | 113 | TRADING_MODE_CONTINUOUS | 140 | 140 | + And the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 2 | 0 | 0 | | + | vamm1-id | -2 | 0 | 0 | true | + And the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 85 | 150 | 0.25 | 0.25 | + + # Now amend the vAMM that doesn't trade and gets rejected + When the parties amend the following AMM: + | party | market id | slippage | base | lower bound | upper bound | error | + | vamm1 | ETH/MAR22 | 0.1 | 140 | 90 | 155 | rebase-order did not trade | + # ensure the status of the vAMM remains the same (if no update event is sent, this test will pass even if the vAMM was in some way changed) + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 85 | 150 | 0.25 | 0.25 | + + # To account for a passing test caused by an event not being sent out, cancel the vAMM and check the status + When the parties cancel the following AMM: + | party | market id | method | + | vamm1 | ETH/MAR22 | METHOD_REDUCE_ONLY | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_REDUCE_ONLY | 100 | 85 | 150 | 0.25 | 0.25 | diff --git a/core/integration/features/amm/0087-VAMM-031.feature b/core/integration/features/amm/0087-VAMM-031.feature new file mode 100644 index 00000000000..af4a71eaad5 --- /dev/null +++ b/core/integration/features/amm/0087-VAMM-031.feature @@ -0,0 +1,165 @@ +Feature: vAMM behaviour when a market settles + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.1 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the oracle spec for settlement data filtering data from "0xCAFECAFE" named "ethMar22Oracle": + | property | type | binding | + | prices.ETH.value | TYPE_INTEGER | settlement data | + And the oracle spec for trading termination filtering data from "0xCAFECAFE" named "ethMar22Oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + And the settlement data decimals for the oracle named "ethMar22Oracle" is given in "0" decimal places + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | default-none | ethMar22Oracle | 1e0 | 0 | SLA-22 | + + # Setting up the accounts and vAMM submission now is part of the background, because we'll be running scenarios 0087-VAMM-006 through 0087-VAMM-014 on this setup + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 1000000 | + | lp2 | USD | 1000000 | + | lp3 | USD | 1000000 | + | party1 | USD | 1000000 | + | party2 | USD | 1000000 | + | party3 | USD | 1000000 | + | party4 | USD | 1000000 | + | party5 | USD | 1000000 | + | vamm1 | USD | 1000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 600 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 400 | 0.015 | submission | + Then the network moves ahead "4" blocks + And the current epoch is "0" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/MAR22 | buy | 20 | 40 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party5 | ETH/MAR22 | buy | 20 | 90 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party3 | ETH/MAR22 | sell | 10 | 110 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | sell | 10 | 160 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 39 | 1000 | 1 | 100 | 100 | 100 | + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.1 | 100 | 85 | 150 | 0.25 | 0.25 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 85 | 150 | 0.25 | 0.25 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_GENERAL | | 1000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + + @VAMM + Scenario Outline: 0087-VAMM-031: When an AMM is active on a market at time of settlement with a position in a well collateralised state, the market can settle successfully and then all funds on the AMM key are transferred back to the main party's account. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 1 | 105 | 1 | TYPE_LIMIT | TIF_GTC | + # see the trades that make the vAMM go short + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 106 | 1 | vamm1-id | true | + + When the network moves ahead "1" blocks + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | supplied stake | target stake | + | 106 | TRADING_MODE_CONTINUOUS | 100 | 100 | 1000 | 84 | + And the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 1 | 0 | 0 | | + | vamm1-id | -1 | 0 | 0 | true | + And the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 85 | 150 | 0.25 | 0.25 | + + # No terminate && settle the market + When the oracles broadcast data signed with "0xCAFECAFE": + | name | value | + | trading.terminated | true | + Then the network moves ahead "1" blocks + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 0 | | | + | vamm1-id | USD | ETH/MAR22 | 778 | 223 | true | + + When the oracles broadcast data signed with "0xCAFECAFE": + | name | value | + | prices.ETH.value | | + Then the market state should be "STATE_SETTLED" for the market "ETH/MAR22" + And then the network moves ahead "1" blocks + + # verify the that the margin balance is released, and then the correct balance if transferred from the pool account back to the party. + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 1 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | | USD | true | TRANSFER_TYPE_MARGIN_HIGH | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1 | ACCOUNT_TYPE_GENERAL | | | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_RELEASE | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | | | | + | vamm1-id | USD | ETH/MAR22 | 0 | 0 | true | + + # Different scenario's involving a final settlement: break even, profit and loss. + Examples: + | settle price | margin | amm balance | general balance | + | 106 | 223 | 1001 | 1001 | # settle price = market price: +1 from fees + | 105 | 224 | 1002 | 1002 | # settle price < market price: +1 from fees +1 from final settlement + | 107 | 222 | 1000 | 1000 | # settle price > market price: +1 from fees, -1 from final settlement + | 104 | 225 | 1003 | 1003 | # settle price < market price: +1 from fees +2 from final settlement + | 108 | 221 | 999 | 999 | # settle price > market price: +1 from fees, -2 from final settlement diff --git a/core/integration/features/amm/0087-VAMM-032.feature b/core/integration/features/amm/0087-VAMM-032.feature new file mode 100644 index 00000000000..86c21e98a39 --- /dev/null +++ b/core/integration/features/amm/0087-VAMM-032.feature @@ -0,0 +1,164 @@ +Feature: vAMM behaviour when a market settles with distressed AMM. + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.1 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the oracle spec for settlement data filtering data from "0xCAFECAFE" named "ethMar22Oracle": + | property | type | binding | + | prices.ETH.value | TYPE_INTEGER | settlement data | + And the oracle spec for trading termination filtering data from "0xCAFECAFE" named "ethMar22Oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + And the settlement data decimals for the oracle named "ethMar22Oracle" is given in "0" decimal places + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | default-none | ethMar22Oracle | 1e0 | 0 | SLA-22 | + + # Setting up the accounts and vAMM submission now is part of the background, because we'll be running scenarios 0087-VAMM-006 through 0087-VAMM-014 on this setup + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 1000000 | + | lp2 | USD | 1000000 | + | lp3 | USD | 1000000 | + | party1 | USD | 1000000 | + | party2 | USD | 1000000 | + | party3 | USD | 1000000 | + | party4 | USD | 1000000 | + | party5 | USD | 1000000 | + | vamm1 | USD | 1000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 600 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 400 | 0.015 | submission | + Then the network moves ahead "4" blocks + And the current epoch is "0" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/MAR22 | buy | 20 | 40 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | sell | 10 | 160 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | + | 100 | TRADING_MODE_CONTINUOUS | 39 | 1000 | 1 | 100 | 100 | 100 | + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower margin ratio | upper margin ratio | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.1 | 100 | 85 | 150 | 0.25 | 0.25 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 85 | 150 | 0.25 | 0.25 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_GENERAL | | 1000 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_LOW | + + @VAMM + Scenario: 0087-VAMM-032: When an AMM is active on a market at time of settlement with a position in a well collateralised state, the market can settle successfully and then all funds on the AMM key are transferred back to the main party's account. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 5 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + | party4 | ETH/MAR22 | buy | 5 | 125 | 1 | TYPE_LIMIT | TIF_GTC | + # see the trades that make the vAMM go short + Then debug trades + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 106 | 1 | vamm1-id | true | + | party4 | 119 | 1 | vamm1-id | true | + + When the network moves ahead "1" blocks + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | static mid price | supplied stake | target stake | + | 119 | TRADING_MODE_CONTINUOUS | 142 | 142 | 1000 | 142 | + And the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 2 | 13 | 0 | | + | vamm1-id | -2 | -13 | 0 | true | + And the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower margin ratio | upper margin ratio | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 85 | 150 | 0.25 | 0.25 | + + # No terminate && settle the market + When the oracles broadcast data signed with "0xCAFECAFE": + | name | value | + | trading.terminated | true | + Then the network moves ahead "1" blocks + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 0 | | | + | vamm1-id | USD | ETH/MAR22 | 488 | 501 | true | + + # Settlement price is ~9x mark price + When the oracles broadcast data signed with "0xCAFECAFE": + | name | value | + | prices.ETH.value | 1000 | + Then the market state should be "STATE_SETTLED" for the market "ETH/MAR22" + And then the network moves ahead "1" blocks + + # verify the that the margin balance is released, and then the correct balance if transferred from the pool account back to the party. + # We see fees on both trades, a MTM loss transfer, margin being allocated, then the loss transfer from the final settlement + # and lastly a transfer of 0 to the general account, indicating there were no funds left to transfer. + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | is amm | type | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 1 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 1 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 13 | USD | true | TRANSFER_TYPE_MTM_LOSS | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 501 | USD | true | TRANSFER_TYPE_MARGIN_LOW | + | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 501 | USD | true | TRANSFER_TYPE_LOSS | + | vamm1-id | ACCOUNT_TYPE_GENERAL | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 488 | USD | true | TRANSFER_TYPE_LOSS | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1 | ACCOUNT_TYPE_GENERAL | | 0 | USD | true | TRANSFER_TYPE_AMM_SUBACCOUNT_RELEASE | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 0 | | | + | vamm1-id | USD | ETH/MAR22 | 0 | 0 | true | diff --git a/core/integration/features/fees/setting-fee-and-rewarding-lps.feature b/core/integration/features/fees/setting-fee-and-rewarding-lps.feature index 41ac670b012..e7a4ef57740 100644 --- a/core/integration/features/fees/setting-fee-and-rewarding-lps.feature +++ b/core/integration/features/fees/setting-fee-and-rewarding-lps.feature @@ -11,11 +11,12 @@ Feature: Test liquidity provider reward distribution | lqm-params | 0.00 | 24h | 1 | And the following network parameters are set: - | name | value | - | market.value.windowLength | 1h | - | network.markPriceUpdateMaximumFrequency | 1s | - | network.markPriceUpdateMaximumFrequency | 0s | - | limits.markets.maxPeggedOrders | 612 | + | name | value | + | market.value.windowLength | 1h | + | network.markPriceUpdateMaximumFrequency | 1s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 612 | + | market.liquidity.equityLikeShareFeeFraction | 1 | And the log normal risk model named "lognormal-risk-model-1": | risk aversion | tau | mu | r | sigma | | 0.001 | 0.01 | 0 | 0.0 | 1.2 | @@ -335,7 +336,8 @@ Feature: Test liquidity provider reward distribution Then the following transfers should happen: | from | to | from account | to account | market id | amount | asset | | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC22 | 41 | ETH | - | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC22 | 0 | ETH | + # zero fee shares are filtered out now, so no transfer events are generated + #| market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC22 | 0 | ETH | # lp2 manually adds some limit orders within PM range, observe automatically deployed orders go down and fee share go up When clear all events @@ -1073,3 +1075,337 @@ Feature: Test liquidity provider reward distribution And the liquidity fee factor should be "0.003" for the market "ETH/DEC21" And the target stake should be "12000" for the market "ETH/DEC21" And the supplied stake should be "16000" for the market "ETH/DEC21" + + @FeeRound + Scenario: 005b, 2 LPs joining at start, unequal commitments, 1 LP lp3 joining later, and 4 LPs lp4/5/6/7 with large commitment and low/high fee joins later (0042-LIQF-032) with the fee factor set to 0.5 + + Given the following network parameters are set: + | name | value | + | market.liquidity.equityLikeShareFeeFraction | 0.5 | + + And the following network parameters are set: + | name | value | + | validators.epoch.length | 600s | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | ETH | 100000000000 | + | lp2 | ETH | 100000000000 | + | lp3 | ETH | 100000000000 | + | lp4 | ETH | 100000000000 | + | lp5 | ETH | 100000000000 | + | lp6 | ETH | 100000000000 | + | lp7 | ETH | 100000000000 | + | party1 | ETH | 100000000000 | + | party2 | ETH | 100000000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | ETH/DEC21 | 8000 | 0.001 | submission | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | lp1 | ETH/DEC21 | 200 | 1 | buy | BID | 200 | 2 | + | lp1 | ETH/DEC21 | 200 | 1 | sell | ASK | 200 | 2 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp2 | lp2 | ETH/DEC21 | 2000 | 0.002 | submission | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | lp2 | ETH/DEC21 | 200 | 1 | buy | BID | 200 | 2 | + | lp2 | ETH/DEC21 | 200 | 1 | sell | ASK | 200 | 2 | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/DEC21 | buy | 1000 | 900 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | ETH/DEC21 | buy | 60 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/DEC21 | sell | 1000 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/DEC21 | sell | 60 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "ETH/DEC21" + + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 60 | party2 | + + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + And the mark price should be "1000" for the market "ETH/DEC21" + And the open interest should be "60" for the market "ETH/DEC21" + And the target stake should be "6000" for the market "ETH/DEC21" + And the supplied stake should be "10000" for the market "ETH/DEC21" + + And the liquidity provider fee shares for the market "ETH/DEC21" should be: + | party | equity like share | average entry valuation | + | lp1 | 0.8 | 8000 | + | lp2 | 0.2 | 10000 | + + And the price monitoring bounds for the market "ETH/DEC21" should be: + | min bound | max bound | + | 500 | 1500 | + + And the liquidity fee factor should be "0.001" for the market "ETH/DEC21" + + # no fees in auction + And the accumulated liquidity fees should be "0" for the market "ETH/DEC21" + + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/DEC21 | sell | 20 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | party1-sell | + | party2 | ETH/DEC21 | buy | 20 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | party2-buy | + + And the following trades should be executed: + | buyer | price | size | seller | + | party2 | 1000 | 20 | party1 | + + And the accumulated liquidity fees should be "20" for the market "ETH/DEC21" + + # opening auction + time window + Then time is updated to "2019-11-30T00:10:05Z" + + # these are different from the tests, but again, we end up with a 2/3 vs 1/3 fee share here. + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC21 | 16 | ETH | + | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC21 | 4 | ETH | + + And the accumulated liquidity fees should be "0" for the market "ETH/DEC21" + + When time is updated to "2019-11-30T00:15:00Z" + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp3 | lp3 | ETH/DEC21 | 10000 | 0.001 | submission | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | lp3 | ETH/DEC21 | 200 | 1 | buy | BID | 200 | 2 | + | lp3 | ETH/DEC21 | 200 | 1 | sell | ASK | 200 | 2 | + Then the network moves ahead "1" blocks" + + And the liquidity provider fee shares for the market "ETH/DEC21" should be: + | party | equity like share | average entry valuation | + | lp1 | 0.4 | 8000 | + | lp2 | 0.1 | 10000 | + | lp3 | 0.5 | 20000 | + + And the liquidity fee factor should be "0.001" for the market "ETH/DEC21" + + When time is updated to "2019-11-30T00:20:00Z" + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/DEC21 | buy | 16 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/DEC21 | sell | 16 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 16 | party2 | + + And the accumulated liquidity fees should be "16" for the market "ETH/DEC21" + + When time is updated to "2019-11-30T00:20:06Z" + # lp3 gets lower fee share than indicated by the ELS this fee round as it was later to deploy liquidity (so lower liquidity scores than others had) + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC21 | 7 | ETH | + | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC21 | 4 | ETH | + | market | lp3 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC21 | 4 | ETH | + + And the accumulated liquidity fees should be "1" for the market "ETH/DEC21" + + # make sure we're in the next time window now + When time is updated to "2019-11-30T00:30:07Z" + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/DEC21 | buy | 16 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/DEC21 | sell | 16 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "17" for the market "ETH/DEC21" + + When time is updated to "2019-11-30T00:40:08Z" + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC21 | 6 | ETH | + | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC21 | 1 | ETH | + | market | lp3 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC21 | 8 | ETH | + And the accumulated liquidity fees should be "2" for the market "ETH/DEC21" + And the liquidity fee factor should be "0.001" for the market "ETH/DEC21" + And the target stake should be "7200" for the market "ETH/DEC21" + And the supplied stake should be "20000" for the market "ETH/DEC21" + #AC 0042-LIQF-024:lp4 joining a market that is above the target stake with a commitment large enough to push one of two higher bids above the target stake, and a higher fee bid than the current fee: the fee doesn't change + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp4 | lp4 | ETH/DEC21 | 20000 | 0.004 | submission | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | lp4 | ETH/DEC21 | 200 | 1 | buy | BID | 200 | 2 | + | lp4 | ETH/DEC21 | 200 | 1 | sell | ASK | 200 | 2 | + Then the network moves ahead "2" blocks + When time is updated to "2019-11-30T00:50:09Z" + And the liquidity fee factor should be "0.001" for the market "ETH/DEC21" + #AC 0042-LIQF-029: lp5 joining a market that is above the target stake with a sufficiently large commitment to push ALL higher bids above the target stake and a lower fee bid than the current fee: their fee is used + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp5 | lp5 | ETH/DEC21 | 30000 | 0.0005 | submission | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | lp5 | ETH/DEC21 | 200 | 1 | buy | BID | 200 | 2 | + | lp5 | ETH/DEC21 | 200 | 1 | sell | ASK | 200 | 2 | + Then the network moves ahead "2" blocks + When time is updated to "2019-11-30T01:00:10Z" + And the liquidity fee factor should be "0.0005" for the market "ETH/DEC21" + And the target stake should be "7200" for the market "ETH/DEC21" + And the supplied stake should be "70000" for the market "ETH/DEC21" + + #AC 0042-LIQF-030: lp6 joining a market that is above the target stake with a commitment not large enough to push any higher bids above the target stake, and a lower fee bid than the current fee: the fee doesn't change + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp6 | lp6 | ETH/DEC21 | 2000 | 0.0001 | submission | + | lp6 | lp6 | ETH/DEC21 | 2000 | 0.0001 | submission | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | lp6 | ETH/DEC21 | 200 | 1 | buy | BID | 200 | 2 | + | lp6 | ETH/DEC21 | 200 | 1 | sell | ASK | 200 | 2 | + Then the network moves ahead "2" blocks + When time is updated to "2019-11-30T01:10:11Z" + And the liquidity fee factor should be "0.0005" for the market "ETH/DEC21" + + @FeeRound + Scenario: 003b, 2 LPs joining at start, equal commitments, unequal offsets with fee fraction set to 0.5 + Given the following network parameters are set: + | name | value | + | limits.markets.maxPeggedOrders | 10 | + | market.liquidity.providersFeeCalculationTimeStep | 5s | + | market.liquidity.equityLikeShareFeeFraction | 0.5 | + And the liquidity sla params named "updated-SLA": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1.0 | 0.5 | 1 | 1.0 | + And the markets are updated: + | id | sla params | linear slippage factor | quadratic slippage factor | + | ETH/DEC22 | updated-SLA | 1e0 | 1e0 | + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | ETH | 100000000000 | + | lp2 | ETH | 100000000000 | + | party1 | ETH | 100000000 | + | party2 | ETH | 100000000 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | ETH/DEC22 | 40000 | 0.001 | submission | + | lp1 | lp1 | ETH/DEC22 | 40000 | 0.001 | | + | lp2 | lp2 | ETH/DEC22 | 40000 | 0.002 | submission | + | lp2 | lp2 | ETH/DEC22 | 40000 | 0.002 | | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | reference | + | lp1 | ETH/DEC22 | 100 | 50 | buy | BID | 100 | 32 | lp1-bids-1 | + | lp1 | ETH/DEC22 | 100 | 50 | sell | ASK | 100 | 32 | lp1-asks-1 | + | lp2 | ETH/DEC22 | 100 | 50 | buy | BID | 100 | 102 | lp2-bids-1 | + | lp2 | ETH/DEC22 | 100 | 50 | sell | ASK | 100 | 102 | lp2-asks-1 | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/DEC22 | buy | 1 | 995 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | ETH/DEC22 | buy | 90 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/DEC22 | sell | 1 | 1005 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/DEC22 | sell | 90 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "ETH/DEC22" + Then the market data for the market "ETH/DEC22" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | best static bid price | static mid price | best static offer price | + | 1000 | TRADING_MODE_CONTINUOUS | 10000 | 893 | 1120 | 43908 | 80000 | 90 | 995 | 1000 | 1005 | + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 90 | party2 | + And the liquidity provider fee shares for the market "ETH/DEC22" should be: + | party | equity like share | average entry valuation | + | lp1 | 0.5 | 40000 | + | lp2 | 0.5 | 80000 | + And the liquidity fee factor should be "0.002" for the market "ETH/DEC22" + # no fees in auction + And the accumulated liquidity fees should be "0" for the market "ETH/DEC22" + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/DEC22 | sell | 20 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/DEC22 | buy | 20 | 1000 | 1 | TYPE_LIMIT | TIF_FOK | + Then the accumulated liquidity fees should be "40" for the market "ETH/DEC22" + + When the network moves ahead "6" blocks + + Then the accumulated liquidity fees should be "1" for the market "ETH/DEC22" + + + # observe that lp2 gets lower share of the fees despite the same commitment amount (that is due to their orders being much wider than those of lp1) + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC22 | 26 | ETH | + | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC22 | 13 | ETH | + + # modify lp2 orders so that they fall outside the price monitoring bounds + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | reference | + | lp2 | ETH/DEC22 | 100 | 50 | buy | BID | 100 | 116 | lp2-bids-2 | + | lp2 | ETH/DEC22 | 100 | 50 | sell | ASK | 100 | 116 | lp2-asks-2 | + And the parties cancel the following orders: + | party | reference | + | lp2 | lp2-bids-1 | + | lp2 | lp2-asks-1 | + And the market data for the market "ETH/DEC22" should be: + | mark price | trading mode | horizon | min bound | max bound | best static bid price | static mid price | best static offer price | + | 1000 | TRADING_MODE_CONTINUOUS | 10000 | 893 | 1120 | 995 | 1000 | 1005 | + And the accumulated liquidity fees should be "1" for the market "ETH/DEC22" + + + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party2 | ETH/DEC22 | buy | 20 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | ETH/DEC22 | sell | 20 | 1000 | 1 | TYPE_LIMIT | TIF_FOK | + Then the accumulated liquidity fees should be "41" for the market "ETH/DEC22" + + When the network moves ahead "6" blocks + + # all the fees go to lp2 + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC22 | 41 | ETH | + # 0 fee transfer is still filtered out to cut down on events. + #| market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC22 | 0 | ETH | + + # lp2 manually adds some limit orders within PM range, observe automatically deployed orders go down and fee share go up + When clear all events + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | lp2 | ETH/DEC22 | buy | 100 | 995 | 0 | TYPE_LIMIT | TIF_GTC | + | lp2 | ETH/DEC22 | sell | 100 | 1005 | 0 | TYPE_LIMIT | TIF_GTC | + + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party2 | ETH/DEC22 | buy | 20 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | ETH/DEC22 | sell | 20 | 1000 | 1 | TYPE_LIMIT | TIF_FOK | + Then the accumulated liquidity fees should be "40" for the market "ETH/DEC22" + + When the network moves ahead "6" blocks + # lp2 has increased their liquidity score by placing limit orders closer to the mid (and within price monitoring bounds), + # hence their fee share is larger (and no longer 0) now. + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC22 | 24 | ETH | + | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC22 | 15 | ETH | + + # lp2 manually adds some pegged orders within PM range, liquidity obligation is now fullfiled by limit and pegged orders so no automatic order deployment takes place + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | reference | + | lp2 | ETH/DEC22 | 100 | 50 | buy | BID | 100 | 1 | lp2-bids-3 | + | lp2 | ETH/DEC22 | 100 | 50 | sell | ASK | 100 | 1 | lp2-asks-3 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party2 | ETH/DEC22 | buy | 20 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | ETH/DEC22 | sell | 20 | 1000 | 1 | TYPE_LIMIT | TIF_FOK | + Then the accumulated liquidity fees should be "41" for the market "ETH/DEC22" + + When the network moves ahead "6" blocks + # lp2 has increased their liquidity score by placing pegged orders closer to the mid (and within price monitoring bounds), + # hence their fee share is larger now. + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC22 | 22 | ETH | + | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC22 | 18 | ETH | + + diff --git a/core/integration/features/liquidity-provision/0042-LIQF-043.feature b/core/integration/features/liquidity-provision/0042-LIQF-043.feature index 2bca3269e61..0ce583c104a 100644 --- a/core/integration/features/liquidity-provision/0042-LIQF-043.feature +++ b/core/integration/features/liquidity-provision/0042-LIQF-043.feature @@ -13,14 +13,15 @@ Feature: Test LP fee distribution in LP mechanics in 0042 | lqm-params | 1.00 | 20s | 1 | And the following network parameters are set: - | name | value | - | market.value.windowLength | 60s | - | network.markPriceUpdateMaximumFrequency | 0s | - | limits.markets.maxPeggedOrders | 6 | - | market.auction.minimumDuration | 1 | - | market.fee.factors.infrastructureFee | 0.001 | - | market.fee.factors.makerFee | 0.004 | - | spam.protection.max.stopOrdersPerMarket | 5 | + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | #risk factor short:3.5569036 #risk factor long:0.801225765 And the following assets are registered: @@ -124,7 +125,77 @@ Feature: Test LP fee distribution in LP mechanics in 0042 | lp2 | market | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ETH/MAR22 | 11 | USD | | market | lp1 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 11 | USD | + @Now + Scenario: 001b: lp1 and lp2 on the market ETH/MAR22, 0042-LIQF-043 with fee share factor set to 0.5 + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 100000 | + | lp2 | USD | 100000 | + | lp3 | USD | 100000 | + | party1 | USD | 100000 | + | party2 | USD | 100000 | + | party3 | USD | 100000 | + And the following network parameters are set: + | name | value | + | market.liquidity.equityLikeShareFeeFraction | 0.5 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 6000 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 4000 | 0.015 | submission | + + When the network moves ahead "4" blocks + And the current epoch is "0" + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 10 | 900 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 10 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | buy | 10 | 950 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | lp1 | ETH/MAR22 | sell | 10 | 1050 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + + Then the opening auction period ends for market "ETH/MAR22" + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 1 | party2 | + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 973 | 1027 | 3556 | 10000 | 1 | + # target_stake = mark_price x max_oi x target_stake_scaling_factor x rf = 1000 x 1 x 1 x 3.5569036 =3556 + When the network moves ahead "1" epochs + And the supplied stake should be "9600" for the market "ETH/MAR22" + And the insurance pool balance should be "400" for the market "ETH/MAR22" + And the current epoch is "1" + Then the parties should have the following account balances: + | party | asset | market id | margin | general | bond | + | lp1 | USD | ETH/MAR22 | 56022 | 37978 | 6000 | + | lp2 | USD | ETH/MAR22 | 0 | 96000 | 3600 | + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/MAR22 | sell | 2 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/MAR22 | buy | 2 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + + When the network moves ahead "1" epochs + And the insurance pool balance should be "760" for the market "ETH/MAR22" + Then the parties should have the following account balances: + | party | asset | market id | margin | general | bond | + | lp1 | USD | ETH/MAR22 | 56022 | 38007 | 6000 | + | lp2 | USD | ETH/MAR22 | 0 | 96000 | 3240 | + + #AC 0042-LIQF-043: The net inflow and outflow into and out of the market's aggregate LP fee account should be zero as a result of penalty collection and bonus distribution. + #lp1 got lp fee 18 and also SLA performance bonus 11, so general account increased from 37978 to 38007 + #lp2 did not place any orders, so all the lp fee for lp1 goes back to ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION (which was distributed to lp1) + + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 16 | USD | + | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 13 | USD | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 16 | USD | + | lp2 | market | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ETH/MAR22 | 13 | USD | + | market | lp1 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 13 | USD | diff --git a/core/integration/features/liquidity-provision/0044-LIME-020.feature b/core/integration/features/liquidity-provision/0044-LIME-020.feature index 85a7dca2474..9483dd45d44 100644 --- a/core/integration/features/liquidity-provision/0044-LIME-020.feature +++ b/core/integration/features/liquidity-provision/0044-LIME-020.feature @@ -13,13 +13,14 @@ Feature: Test LP mechanics when there are multiple liquidity providers; | lqm-params | 1.0 | 20s | 1 | And the following network parameters are set: - | name | value | - | market.value.windowLength | 60s | - | network.markPriceUpdateMaximumFrequency | 0s | - | limits.markets.maxPeggedOrders | 6 | - | market.auction.minimumDuration | 1 | - | market.fee.factors.infrastructureFee | 0.001 | - | market.fee.factors.makerFee | 0.004 | + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | market.liquidity.equityLikeShareFeeFraction | 1 | #risk factor short:3.5569036 #risk factor long:0.801225765 And the following assets are registered: diff --git a/core/integration/features/liquidity-provision/0044-LIME-062.feature b/core/integration/features/liquidity-provision/0044-LIME-062.feature index 577f1158ad3..096474b4f87 100644 --- a/core/integration/features/liquidity-provision/0044-LIME-062.feature +++ b/core/integration/features/liquidity-provision/0044-LIME-062.feature @@ -25,6 +25,7 @@ Feature: Test changing market.liquidity.providersFeeCalculationTimeStep; | validators.epoch.length | 15s | | market.liquidity.earlyExitPenalty | 0.25 | | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + | market.liquidity.equityLikeShareFeeFraction | 1 | Given the liquidity monitoring parameters: | name | triggering ratio | time window | scaling factor | @@ -147,3 +148,104 @@ Feature: Test changing market.liquidity.providersFeeCalculationTimeStep; | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 18 | USD | | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 48 | USD | | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 32 | USD | + + @Now + Scenario: 001b: lp1 and lp2 on the market ETH/MAR22, 0044-LIME-062 with ELS fee share fraction set to 0.5 + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 100000 | + | lp2 | USD | 100000 | + | party1 | USD | 1000000 | + | party2 | USD | 1000000 | + And the following network parameters are set: + | name | value | + | market.liquidity.equityLikeShareFeeFraction | 0.5 | + + And the network moves ahead "1" blocks + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 6000 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 4000 | 0.015 | submission | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 10 | 900 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 10 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | buy | 10 | 950 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | lp2 | ETH/MAR22 | buy | 10 | 970 | 0 | TYPE_LIMIT | TIF_GTC | lp2-b | + | lp2 | ETH/MAR22 | sell | 10 | 1020 | 0 | TYPE_LIMIT | TIF_GTC | lp2-s | + | lp1 | ETH/MAR22 | sell | 10 | 1050 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + + Then the opening auction period ends for market "ETH/MAR22" + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 1 | party2 | + + When the network moves ahead "4" blocks + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 973 | 1027 | 3556 | 10000 | 1 | + + + Then the network moves ahead "1" epochs + Then the following network parameters are set: + | name | value | + | market.liquidity.providersFeeCalculationTimeStep | 3s | + + # As we are still within the epoch, the change to 3s distributions should not occur yet, so we make a trade + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | sell | 2 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | buy | 2 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | | + + # Then forward enough blocks that the 3s setting would have caused a distribution and place another trade + Then the network moves ahead "4" blocks + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 2 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 2 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | | + + Then the network moves ahead "8" blocks + + # Now forward enough that a distribution does occur at the original 10s frequency and see one took place with the + # volume from both orders in one transfer, implying nothing happened between the two orders + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 33 | USD | + | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 27 | USD | + + # We are now nearly at the epoch boundary, so place an order just before + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | sell | 2 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | buy | 2 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | | + + Then the network moves ahead "1" epochs + # And once we pass the epoch, this is distributed to the fee accounts at the new frequency + And the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 16 | USD | + | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 13 | USD | + + # So now if we place a new trade + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 3 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 3 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | | + Then the network moves ahead "4" blocks + # Forward past the distribution frequency cutoff and place another + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | sell | 4 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | buy | 4 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | | + + # Then forward enough to cause them both to distribute, the fees are instead sent as two separate distributions + Then the network moves ahead "7" blocks + And the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 25 | USD | + | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 44 | USD | + | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 20 | USD | + | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 36 | USD | diff --git a/core/integration/features/spot/liquidity_provision/0044-LIME-045.feature b/core/integration/features/spot/liquidity_provision/0044-LIME-045.feature index 96c9a67dc50..eb004028a64 100644 --- a/core/integration/features/spot/liquidity_provision/0044-LIME-045.feature +++ b/core/integration/features/spot/liquidity_provision/0044-LIME-045.feature @@ -1,5 +1,6 @@ Feature: Spot market SLA + @SLP Scenario: 0044-LIME-045, when target stake > total stake, and LP reduces LP commitment Given the fees configuration named "fees-config-1": | maker fee | infrastructure fee | @@ -152,8 +153,8 @@ Feature: Spot market SLA Then the network moves ahead "2" blocks And the network treasury balance should be "295" for the asset "ETH" - And the party "lpprov1" lp liquidity fee account balance should be "0" for the market "BTC/ETH" - And the party "lpprov2" lp liquidity fee account balance should be "14" for the market "BTC/ETH" + And the party "lpprov1" lp liquidity fee account balance should be "7" for the market "BTC/ETH" + And the party "lpprov2" lp liquidity fee account balance should be "7" for the market "BTC/ETH" Then "lpprov1" should have holding account balance of "480" for asset "ETH" Then "lpprov1" should have holding account balance of "60" for asset "BTC" diff --git a/core/integration/features/verified/0042-LIQF-SLA.feature b/core/integration/features/verified/0042-LIQF-SLA.feature index 673126b01c0..721b030db4d 100644 --- a/core/integration/features/verified/0042-LIQF-SLA.feature +++ b/core/integration/features/verified/0042-LIQF-SLA.feature @@ -11,6 +11,7 @@ Feature: Calculating SLA Performance | market.liquidity.providersFeeCalculationTimeStep | 1s | | validators.epoch.length | 58s | | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.equityLikeShareFeeFraction | 1 | And the average block duration is "1" @@ -715,7 +716,6 @@ Feature: Calculating SLA Performance | lp2 | | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ETH/DEC23 | 100 | USD | | | lp1 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | ETH/DEC23 | 150 | USD | - Scenario: 4 LPs acheive various penalty fractions, unpaid liquidity fees distributed correctly as a bonus (0042-LIQF-055) # Initialise the market with the required parameters @@ -792,3 +792,84 @@ Feature: Calculating SLA Performance | | lp1 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | ETH/DEC23 | 24673 | USD | | | lp2 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | ETH/DEC23 | 2344 | USD | | | lp3 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | ETH/DEC23 | 69087 | USD | + + Scenario: 4 LPs acheive various penalty fractions, unpaid liquidity fees distributed correctly as a bonus (0042-LIQF-055) + fee fraction set to 0.5 + + Given the following network parameters are set: + | name | value | + | market.liquidity.equityLikeShareFeeFraction | 0.5 | + # Initialise the market with the required parameters + And the liquidity sla params named "scenario-sla-params": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1 | 0 | 1 | 1 | + And the markets are updated: + | id | sla params | linear slippage factor | quadratic slippage factor | + | ETH/DEC23 | scenario-sla-params | 1e-3 | 0 | + + And the following network parameters are set: + | name | value | + | validators.epoch.length | 98s | + + # Setup the market with 4 LPs who initially meet their commitment + Given the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | ETH/DEC23 | 10000000 | 0.1 | submission | + | lp2 | lp2 | ETH/DEC23 | 1000000 | 0.1 | submission | + | lp3 | lp3 | ETH/DEC23 | 70000000 | 0.1 | submission | + | lp4 | lp4 | ETH/DEC23 | 919000000 | 0.1 | submission | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/DEC23 | buy | 10000 | 999 | 0 | TYPE_LIMIT | TIF_GTC | lp1-bid | + | lp1 | ETH/DEC23 | sell | 10000 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | lp1-ask | + | lp2 | ETH/DEC23 | buy | 1000 | 999 | 0 | TYPE_LIMIT | TIF_GTC | lp2-bid | + | lp2 | ETH/DEC23 | sell | 1000 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | lp2-ask | + | lp3 | ETH/DEC23 | buy | 70000 | 999 | 0 | TYPE_LIMIT | TIF_GTC | lp3-bid | + | lp3 | ETH/DEC23 | sell | 70000 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | lp3-ask | + | lp4 | ETH/DEC23 | buy | 919000 | 999 | 0 | TYPE_LIMIT | TIF_GTC | lp4-bid | + | lp4 | ETH/DEC23 | sell | 919000 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | lp4-ask | + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/DEC23 | buy | 1 | 990 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | ETH/DEC23 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux1 | ETH/DEC23 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | ETH/DEC23 | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "ETH/DEC23" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC23" + + # Generate liquidity fees to be allocated to the LP + Given the network moves ahead "1" epochs + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/DEC23 | buy | 1000 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/DEC23 | sell | 1000 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + Then the accumulated liquidity fees should be "100000" for the market "ETH/DEC23" + + # Ensure LPs have the correct penalty fractions whilst having approx. equal average liquidity scores + Given the parties amend the following orders: + | party | reference | price | size delta | tif | + | lp4 | lp4-bid | 999 | -1 | TIF_GTC | + | lp4 | lp4-ask | 1001 | -1 | TIF_GTC | + And the network moves ahead "40" blocks + And the parties amend the following orders: + | party | reference | price | size delta | tif | + | lp3 | lp3-bid | 999 | -1 | TIF_GTC | + | lp3 | lp3-ask | 1001 | -1 | TIF_GTC | + And the network moves ahead "55" blocks + And the parties amend the following orders: + | party | reference | price | size delta | tif | + | lp2 | lp2-bid | 999 | -1 | TIF_GTC | + | lp2 | lp2-ask | 1001 | -1 | TIF_GTC | + When the network moves ahead "1" epochs + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC23 | 13000 | USD | + | | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC23 | 12550 | USD | + | | lp3 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC23 | 16000 | USD | + | | lp4 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/DEC23 | 58450 | USD | + | lp1 | lp1 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | ETH/DEC23 | 13000 | USD | + | lp2 | lp2 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | ETH/DEC23 | 11922 | USD | + | lp3 | lp3 | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_GENERAL | ETH/DEC23 | 6400 | USD | + | | lp1 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | ETH/DEC23 | 28503 | USD | + | | lp2 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | ETH/DEC23 | 26141 | USD | + | | lp3 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | ETH/DEC23 | 14032 | USD | + | | lp3 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | ETH/DEC23 | 2 | USD | diff --git a/core/integration/features/verified/0042-LIQF-SLA_spot.feature b/core/integration/features/verified/0042-LIQF-SLA_spot.feature index 95be0bc73c6..9adb42a487c 100644 --- a/core/integration/features/verified/0042-LIQF-SLA_spot.feature +++ b/core/integration/features/verified/0042-LIQF-SLA_spot.feature @@ -488,6 +488,7 @@ Feature: Calculating SLA Performance | lp2 | | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | BTC/ETH | 100 | ETH | | | lp1 | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | BTC/ETH | 150 | ETH | + Scenario: 4 LPs acheive various penalty fractions, unpaid liquidity fees distributed correctly as a bonus (0042-LIQF-105) # Initialise the market with the required parameters Given the liquidity sla params named "scenario-sla-params": @@ -500,6 +501,8 @@ Feature: Calculating SLA Performance And the following network parameters are set: | name | value | | validators.epoch.length | 98s | + | market.liquidity.equityLikeShareFeeFraction | 1 | + # Setup the market with 4 LPs who initially meet their commitment Given the parties submit the following liquidity provision: diff --git a/core/integration/features/verified/0042-LIQF-fees_rewards.feature b/core/integration/features/verified/0042-LIQF-fees_rewards.feature index 2e7696d3c8d..2104b1ebbce 100644 --- a/core/integration/features/verified/0042-LIQF-fees_rewards.feature +++ b/core/integration/features/verified/0042-LIQF-fees_rewards.feature @@ -14,12 +14,13 @@ Feature: Test liquidity provider reward distribution; Should also cover liquidit | horizon | probability | auction extension | | 1 | 0.99 | 3 | And the following network parameters are set: - | name | value | - | market.value.windowLength | 1h | - | network.markPriceUpdateMaximumFrequency | 0s | - | limits.markets.maxPeggedOrders | 8 | - | validators.epoch.length | 24h | - | market.liquidity.providersFeeCalculationTimeStep | 600s | + | name | value | + | market.value.windowLength | 1h | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 8 | + | validators.epoch.length | 24h | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.liquidity.providersFeeCalculationTimeStep | 600s | Given the liquidity monitoring parameters: | name | triggering ratio | time window | scaling factor | | lqm-params | 0.0 | 24h | 1.0 | @@ -279,20 +280,20 @@ Feature: Test liquidity provider reward distribution; Should also cover liquidit And the parties submit the following liquidity provision: | id | party | market id | commitment amount | fee | lp type | error | - | lp1 | lp1 | ETH/MAR22 | 8000 | -0.001 | submission | invalid liquidity provision fee | + | lp1 | lp1 | ETH/MAR22 | 8000 | -0.001 | submission | invalid liquidity provision fee | And the parties submit the following liquidity provision: | id | party | market id | commitment amount | fee | lp type | - | lp1 | lp1 | ETH/MAR22 | 8000 | 0 | submission | + | lp1 | lp1 | ETH/MAR22 | 8000 | 0 | submission | And the parties submit the following liquidity provision: | id | party | market id | commitment amount | fee | lp type | - | lp1 | lp1 | ETH/MAR22 | 8000 | 0.001 | amendment | + | lp1 | lp1 | ETH/MAR22 | 8000 | 0.001 | amendment | And the parties place the following pegged iceberg orders: - | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | - | lp1 | ETH/MAR22 | 2 | 1 | buy | MID | 2 | 1 | - | lp1 | ETH/MAR22 | 2 | 1 | sell | MID | 2 | 1 | + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | lp1 | ETH/MAR22 | 2 | 1 | buy | MID | 2 | 1 | + | lp1 | ETH/MAR22 | 2 | 1 | sell | MID | 2 | 1 | And the parties submit the following liquidity provision: | id | party | market id | commitment amount | fee | lp type | | lp2 | lp2 | ETH/MAR22 | 2000 | 0.002 | submission | @@ -300,9 +301,9 @@ Feature: Test liquidity provider reward distribution; Should also cover liquidit | lp2 | lp2 | ETH/MAR22 | 2000 | 0.002 | submission | | lp2 | lp2 | ETH/MAR22 | 2000 | 0.002 | submission | And the parties place the following pegged iceberg orders: - | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | - | lp2 | ETH/MAR22 | 2 | 1 | buy | MID | 2 | 1 | - | lp2 | ETH/MAR22 | 2 | 1 | sell | MID | 2 | 1 | + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | lp2 | ETH/MAR22 | 2 | 1 | buy | MID | 2 | 1 | + | lp2 | ETH/MAR22 | 2 | 1 | sell | MID | 2 | 1 | Then the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | @@ -358,11 +359,11 @@ Feature: Test liquidity provider reward distribution; Should also cover liquidit And the accumulated liquidity fees should be "0" for the market "ETH/MAR22" And the parties place the following pegged iceberg orders: - | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | - | lp1 | ETH/MAR22 | 2 | 1 | buy | MID | 6 | 1 | - | lp1 | ETH/MAR22 | 2 | 1 | sell | MID | 6 | 1 | - | lp2 | ETH/MAR22 | 2 | 1 | buy | MID | 2 | 1 | - | lp2 | ETH/MAR22 | 2 | 1 | sell | MID | 2 | 1 | + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | lp1 | ETH/MAR22 | 2 | 1 | buy | MID | 6 | 1 | + | lp1 | ETH/MAR22 | 2 | 1 | sell | MID | 6 | 1 | + | lp2 | ETH/MAR22 | 2 | 1 | buy | MID | 2 | 1 | + | lp2 | ETH/MAR22 | 2 | 1 | sell | MID | 2 | 1 | Then the parties place the following orders with ticks: | party | market id | side | volume | price | resulting trades | type | tif | reference | diff --git a/core/integration/features/verified/0042-LIQF-fees_rewards_growing_market.feature b/core/integration/features/verified/0042-LIQF-fees_rewards_growing_market.feature index 97f3a37ed62..50559608ae2 100644 --- a/core/integration/features/verified/0042-LIQF-fees_rewards_growing_market.feature +++ b/core/integration/features/verified/0042-LIQF-fees_rewards_growing_market.feature @@ -12,12 +12,13 @@ Feature: | horizon | probability | auction extension | | 1 | 0.99 | 3 | And the following network parameters are set: - | name | value | - | market.value.windowLength | 5m | - | network.markPriceUpdateMaximumFrequency | 0s | - | limits.markets.maxPeggedOrders | 8 | - | validators.epoch.length | 10s | + | name | value | + | market.value.windowLength | 5m | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 8 | + | validators.epoch.length | 10s | | market.liquidity.providersFeeCalculationTimeStep | 1s | + | market.liquidity.equityLikeShareFeeFraction | 1 | Given the liquidity monitoring parameters: | name | triggering ratio | time window | scaling factor | | lqm-params | 0.0 | 24h | 2.5 | diff --git a/core/integration/features/verified/0042-LIQF-fees_rewards_multi_lps.feature b/core/integration/features/verified/0042-LIQF-fees_rewards_multi_lps.feature index 99519ff046e..827561589af 100644 --- a/core/integration/features/verified/0042-LIQF-fees_rewards_multi_lps.feature +++ b/core/integration/features/verified/0042-LIQF-fees_rewards_multi_lps.feature @@ -20,11 +20,12 @@ Feature: Test liquidity provider reward distribution when there are multiple liq | horizon | probability | auction extension | | 3600 | 0.99 | 3 | And the following network parameters are set: - | name | value | - | market.value.windowLength | 1h | - | network.markPriceUpdateMaximumFrequency | 0s | - | limits.markets.maxPeggedOrders | 8 | - | market.liquidity.providersFeeCalculationTimeStep | 10s | + | name | value | + | market.value.windowLength | 1h | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 8 | + | market.liquidity.providersFeeCalculationTimeStep | 10s | + | market.liquidity.equityLikeShareFeeFraction | 1 | Given the liquidity monitoring parameters: | name | triggering ratio | time window | scaling factor | | lqm-params | 1.0 | 24h | 1.0 | @@ -58,13 +59,13 @@ Feature: Test liquidity provider reward distribution when there are multiple liq | lp3 | lp3 | ETH/MAR22 | 1000000000 | 0.003 | amendment | When the network moves ahead "2" blocks And the parties place the following pegged iceberg orders: - | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | - | lp1 | ETH/MAR22 | 38 | 1 | buy | BID | 38 | 20 | - | lp1 | ETH/MAR22 | 31 | 1 | sell | ASK | 31 | 20 | - | lp2 | ETH/MAR22 | 38 | 1 | buy | BID | 38 | 20 | - | lp2 | ETH/MAR22 | 31 | 1 | sell | ASK | 31 | 20 | - | lp3 | ETH/MAR22 | 38 | 1 | buy | BID | 38 | 20 | - | lp3 | ETH/MAR22 | 31 | 1 | sell | ASK | 31 | 20 | + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | lp1 | ETH/MAR22 | 38 | 1 | buy | BID | 38 | 20 | + | lp1 | ETH/MAR22 | 31 | 1 | sell | ASK | 31 | 20 | + | lp2 | ETH/MAR22 | 38 | 1 | buy | BID | 38 | 20 | + | lp2 | ETH/MAR22 | 31 | 1 | sell | ASK | 31 | 20 | + | lp3 | ETH/MAR22 | 38 | 1 | buy | BID | 38 | 20 | + | lp3 | ETH/MAR22 | 31 | 1 | sell | ASK | 31 | 20 | Then the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | @@ -85,10 +86,10 @@ Feature: Test liquidity provider reward distribution when there are multiple liq Then the order book should have the following volumes for market "ETH/MAR22": | side | price | volume | - | buy | 880 | 114 | + | buy | 880 | 114 | | buy | 900 | 10 | | sell | 1100 | 10 | - | sell | 1120 | 93 | + | sell | 1120 | 93 | And the liquidity provider fee shares for the market "ETH/MAR22" should be: | party | equity like share | average entry valuation | @@ -98,11 +99,11 @@ Feature: Test liquidity provider reward distribution when there are multiple liq And the parties should have the following account balances: | party | asset | market id | margin | general | bond | - | lp1 | USD | ETH/MAR22 | 1653960171 | 9998346029829 | 10000 | - | lp2 | USD | ETH/MAR22 | 1653960171 | 9998345039829 | 1000000 | - | lp3 | USD | ETH/MAR22 | 1653960171 | 9997346039829 | 1000000000 | - | party1 | USD | ETH/MAR22 | 228207540 | 999771792460 | | - | party2 | USD | ETH/MAR22 | 1120424632 | 98879575368 | | + | lp1 | USD | ETH/MAR22 | 1653960171 | 9998346029829 | 10000 | + | lp2 | USD | ETH/MAR22 | 1653960171 | 9998345039829 | 1000000 | + | lp3 | USD | ETH/MAR22 | 1653960171 | 9997346039829 | 1000000000 | + | party1 | USD | ETH/MAR22 | 228207540 | 999771792460 | | + | party2 | USD | ETH/MAR22 | 1120424632 | 98879575368 | | Then the network moves ahead "1" blocks @@ -121,18 +122,18 @@ Feature: Test liquidity provider reward distribution when there are multiple liq And the parties should have the following account balances: | party | asset | market id | margin | general | bond | - | lp1 | USD | ETH/MAR22 | 1653960171 | 9998346029829 | 10000 | - | lp2 | USD | ETH/MAR22 | 1653960171 | 9998345039829 | 1000000 | - | lp3 | USD | ETH/MAR22 | 1653960171 | 9997346039829 | 1000000000 | - | party1 | USD | ETH/MAR22 | 1067071078 | 998933008922 | | - | party2 | USD | ETH/MAR22 | 1120424632 | 98878695368 | | + | lp1 | USD | ETH/MAR22 | 1653960171 | 9998346029829 | 10000 | + | lp2 | USD | ETH/MAR22 | 1653960171 | 9998345039829 | 1000000 | + | lp3 | USD | ETH/MAR22 | 1653960171 | 9997346039829 | 1000000000 | + | party1 | USD | ETH/MAR22 | 1067071078 | 998933008922 | | + | party2 | USD | ETH/MAR22 | 1120424632 | 98878695368 | | Then the order book should have the following volumes for market "ETH/MAR22": | side | price | volume | - | buy | 880 | 114 | + | buy | 880 | 114 | | buy | 900 | 10 | | sell | 1100 | 10 | - | sell | 1120 | 93 | + | sell | 1120 | 93 | And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/MAR22" And the accumulated liquidity fees should be "600000" for the market "ETH/MAR22" @@ -140,10 +141,10 @@ Feature: Test liquidity provider reward distribution when there are multiple liq And the following transfers should happen: - | from | to | from account | to account | market id | amount | asset | - | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 5 | USD | - | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 599 | USD | - | market | lp3 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 599394 | USD | + | from | to | from account | to account | market id | amount | asset | + | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 5 | USD | + | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 599 | USD | + | market | lp3 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 599394 | USD | And the accumulated liquidity fees should be "1" for the market "ETH/MAR22" diff --git a/core/integration/features/verified/0042-LIQF-fees_rewards_rounding.feature b/core/integration/features/verified/0042-LIQF-fees_rewards_rounding.feature index 06696133b60..e5e7f98ad35 100644 --- a/core/integration/features/verified/0042-LIQF-fees_rewards_rounding.feature +++ b/core/integration/features/verified/0042-LIQF-fees_rewards_rounding.feature @@ -2,11 +2,12 @@ Feature: All liquidity providers with `average fraction of liquidity provided by Scenario: 001: 0042-LIQF-015 Given the following network parameters are set: - | name | value | - | market.value.windowLength | 1h | - | network.markPriceUpdateMaximumFrequency | 0s | - | limits.markets.maxPeggedOrders | 4 | + | name | value | + | market.value.windowLength | 1h | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 4 | | market.liquidity.providersFeeCalculationTimeStep | 600s | + | market.liquidity.equityLikeShareFeeFraction | 1 | Given the liquidity monitoring parameters: | name | triggering ratio | time window | scaling factor | | lqm-params | 0.0 | 24h | 1.0 | @@ -110,3 +111,115 @@ Feature: All liquidity providers with `average fraction of liquidity provided by | from | to | from account | to account | market id | amount | asset | | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 1980399 | USD | | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 0 | USD | + + Scenario: 001b: 0042-LIQF-015 + equityLikeShareFeeFraction set to 0.5 + Given the following network parameters are set: + | name | value | + | market.value.windowLength | 1h | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 4 | + | market.liquidity.providersFeeCalculationTimeStep | 600s | + | market.liquidity.equityLikeShareFeeFraction | 0.5 | + Given the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 0.0 | 24h | 1.0 | + + And the following assets are registered: + | id | decimal places | + | ETH | 5 | + | USD | 5 | + And the average block duration is "2" + + And the log normal risk model named "log-normal-risk-model-1": + | risk aversion | tau | mu | r | sigma | + | 0.000001 | 0.1 | 0 | 0 | 1.0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 100000 | 0.99 | 3 | + And the liquidity sla params named "SLA": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 1.0 | 0.5 | 1 | 1.0 | + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | decimal places | position decimal places | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | ETH | USD | lqm-params | log-normal-risk-model-1 | default-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | default-eth-for-future | 0 | 0 | 0.5 | 0 | SLA | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 100000000000000 | + | lp2 | USD | 100000000000000 | + | lp3 | USD | 100000000000000 | + | party1 | USD | 10000000000000 | + | party2 | USD | 10000000000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lp1 | ETH/MAR22 | 800000000000 | 0.001 | submission | + | lp1 | lp1 | ETH/MAR22 | 800000000000 | 0.001 | submission | + | lp1 | lp1 | ETH/MAR22 | 800000000000 | 0.001 | submission | + | lp1 | lp1 | ETH/MAR22 | 800000000000 | 0.001 | submission | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | lp1 | ETH/MAR22 | 2 | 1 | buy | BID | 1 | 2 | + | lp1 | ETH/MAR22 | 2 | 1 | buy | MID | 2 | 1 | + | lp1 | ETH/MAR22 | 2 | 1 | sell | ASK | 1 | 2 | + | lp1 | ETH/MAR22 | 2 | 1 | sell | MID | 2 | 1 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp2 | lp2 | ETH/MAR22 | 100000 | 0.002 | submission | + | lp2 | lp2 | ETH/MAR22 | 100000 | 0.002 | submission | + | lp2 | lp2 | ETH/MAR22 | 100000 | 0.002 | submission | + | lp2 | lp2 | ETH/MAR22 | 100000 | 0.002 | submission | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | lp2 | ETH/MAR22 | 2 | 1 | buy | BID | 1 | 2 | + | lp2 | ETH/MAR22 | 2 | 1 | buy | MID | 2 | 1 | + | lp2 | ETH/MAR22 | 2 | 1 | sell | ASK | 1 | 2 | + | lp2 | ETH/MAR22 | 2 | 1 | sell | MID | 2 | 1 | + + Then the parties place the following orders with ticks: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/MAR22 | buy | 1 | 900 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | ETH/MAR22 | buy | 60 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/MAR22 | sell | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/MAR22 | sell | 60 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "ETH/MAR22" + + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 60 | party2 | + + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/MAR22" + And the mark price should be "1000" for the market "ETH/MAR22" + And the open interest should be "60" for the market "ETH/MAR22" + And the target stake should be "21341400000" for the market "ETH/MAR22" + And the supplied stake should be "800000100000" for the market "ETH/MAR22" + + And the liquidity provider fee shares for the market "ETH/MAR22" should be: + | party | equity like share | average entry valuation | + | lp1 | 0.9999998750000156 | 800000000000 | + | lp2 | 0.0000001249999844 | 800000100000 | + + And the liquidity fee factor should be "0.001" for the market "ETH/MAR22" + + # no fees in auction + And the accumulated liquidity fees should be "0" for the market "ETH/MAR22" + + Then the parties place the following orders with ticks: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | sell | 20 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | party1-sell | + | party2 | ETH/MAR22 | buy | 20 | 1000 | 3 | TYPE_LIMIT | TIF_GTC | party2-buy | + And the liquidity fee factor should be "0.001" for the market "ETH/MAR22" + + And the accumulated liquidity fees should be "1980400" for the market "ETH/MAR22" + + # check lp fee distribution + Then time is updated to "2019-11-30T00:10:05Z" + + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 1485299 | USD | + | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 495100 | USD | diff --git a/core/integration/features/verified/0042-LIQF-fees_rewards_with_decimal.feature b/core/integration/features/verified/0042-LIQF-fees_rewards_with_decimal.feature index 04d59b3aa55..a71ff2f2376 100644 --- a/core/integration/features/verified/0042-LIQF-fees_rewards_with_decimal.feature +++ b/core/integration/features/verified/0042-LIQF-fees_rewards_with_decimal.feature @@ -3,11 +3,12 @@ Feature: Test decimal places in LP order, liquidity provider reward distribution @SLABug Scenario: 001: 0070-MKTD-007, 0042-LIQF-001, 0018-RSKM-005, 0018-RSKM-008 Given the following network parameters are set: - | name | value | - | market.value.windowLength | 1h | - | network.markPriceUpdateMaximumFrequency | 0s | - | limits.markets.maxPeggedOrders | 18 | + | name | value | + | market.value.windowLength | 1h | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 18 | | market.liquidity.providersFeeCalculationTimeStep | 600s | + | market.liquidity.equityLikeShareFeeFraction | 1 | Given the liquidity monitoring parameters: | name | triggering ratio | time window | scaling factor | | lqm-params | 0.0 | 24h | 1.0 | @@ -360,7 +361,7 @@ Feature: Test decimal places in LP order, liquidity provider reward distribution And the parties should have the following account balances: | party | asset | market id | margin | general | bond | - | lp1 | ETH | USD/DEC21 | 3841456 | 99999989278673 | 1000000 | + | lp1 | ETH | USD/DEC21 | 3841456 | 99999989278976 | 1000000 | | lp1 | USD | | | 100000000000 | | # amend LP commintment amount @@ -428,7 +429,7 @@ Feature: Test decimal places in LP order, liquidity provider reward distribution And the parties should have the following account balances: | party | asset | market id | margin | general | bond | - | lp1 | ETH | USD/DEC19 | 5854618 | 99996388265511 | 3600000000 | + | lp1 | ETH | USD/DEC19 | 5854618 | 99996388265814 | 3600000000 | # Reduce LP stake below target, results in slashing And the parties submit the following liquidity provision: @@ -440,7 +441,7 @@ Feature: Test decimal places in LP order, liquidity provider reward distribution # This should be slashed, as amendment brought market below target stake, but is currently not And the parties should have the following account balances: | party | asset | market id | margin | general | bond | - | lp1 | ETH | USD/DEC19 | 5854618 | 99997426028383 | 10 | + | lp1 | ETH | USD/DEC19 | 5854618 | 99997426028686 | 10 | And the market data for the market "USD/DEC19" should be: | mark price | last traded price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | diff --git a/core/integration/features/verified/0044-LIME-SLA.feature b/core/integration/features/verified/0044-LIME-SLA.feature index 15bf30442f8..da060396cf2 100644 --- a/core/integration/features/verified/0044-LIME-SLA.feature +++ b/core/integration/features/verified/0044-LIME-SLA.feature @@ -52,6 +52,8 @@ Feature: Test LP mechanics when there are multiple liquidity providers; | market.liquidity.sla.nonPerformanceBondPenaltyMax | 1 | | validators.epoch.length | 10s | | market.liquidity.providersFeeCalculationTimeStep | 10s | + | market.liquidity.equityLikeShareFeeFraction | 1 | + Given the liquidity monitoring parameters: | name | triggering ratio | time window | scaling factor | | lqm-params | 0.5 | 20s | 1.0 | @@ -406,3 +408,94 @@ Feature: Test LP mechanics when there are multiple liquidity providers; Then the parties should have the following account balances: | party | asset | market id | margin | general | bond | | lp1 | USD | ETH/JAN23 | 2806398 | 17013602 | 22500 | + + @Now + Scenario: 001b: lp1 and lp2 under supplies liquidity (and expects to get penalty for not meeting the SLA) since both have orders outside price range, this time with half the fees paid based on score. + # half of the fees get paid based on score, the other half will be paid based on ELS. + Given the following network parameters are set: + | name | value | + | market.liquidity.equityLikeShareFeeFraction | 0.5 | + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 200000 | + | lp2 | USD | 15000 | + | party1 | USD | 100000 | + | party2 | USD | 100000 | + | party3 | USD | 100000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 80000 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 500 | 0.01 | submission | + + When the network moves ahead "2" blocks + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | reference | + | lp1 | ETH/MAR22 | 2 | 1 | buy | BID | 2 | 200 | lp-b-1 | + | lp1 | ETH/MAR22 | 2 | 1 | sell | ASK | 2 | 200 | lp-s-1 | + | lp2 | ETH/MAR22 | 2 | 1 | buy | BID | 2 | 200 | lp-b-2 | + | lp2 | ETH/MAR22 | 2 | 1 | sell | ASK | 2 | 200 | lp-s-2 | + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/MAR22 | buy | 10 | 900 | 0 | TYPE_LIMIT | TIF_GTC | + | party1 | ETH/MAR22 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/MAR22 | sell | 10 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/MAR22 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + + Then the opening auction period ends for market "ETH/MAR22" + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000 | 1 | party2 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 973 | 1027 | 3556 | 80500 | 1 | + # # target_stake = mark_price x max_oi x target_stake_scaling_factor x rf = 1000 x 10 x 1 x 3.5569036 + + And the liquidity fee factor should be "0.02" for the market "ETH/MAR22" + + And the parties should have the following account balances: + | party | asset | market id | margin | general | bond | + | lp1 | USD | ETH/MAR22 | 10671 | 109329 | 80000 | + | lp2 | USD | ETH/MAR22 | 10671 | 3829 | 500 | + #margin_intial lp2: 2*1000*3.5569036*1.5=10671 + #lp1: 21342+98658+80000=200000; lp2: 10671+3829+500=15000 + + Then the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/MAR22 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | party2 | ETH/MAR22 | sell | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | + | 1000 | TRADING_MODE_CONTINUOUS | 3600 | 973 | 1027 | 7113 | 80500 | 2 | + + Then the network moves ahead "6" blocks + + And the parties should have the following account balances: + | party | asset | market id | margin | general | bond | + | lp1 | USD | ETH/MAR22 | 10671 | 109329 | 40000 | + | lp2 | USD | ETH/MAR22 | 10671 | 3829 | 250 | + #liquidity fee: 1000*0.02 = 20; lp1 get 19, lp2 get 0 + + Then the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 14 | USD | + | lp1 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_INSURANCE | ETH/MAR22 | 40000 | USD | + | lp2 | market | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_INSURANCE | ETH/MAR22 | 250 | USD | + | lp1 | market | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_INSURANCE | ETH/MAR22 | 14 | USD | + + And the insurance pool balance should be "40269" for the market "ETH/MAR22" + + Then the network moves ahead "6" blocks + + And the parties should have the following account balances: + | party | asset | market id | margin | general | bond | + | lp1 | USD | ETH/MAR22 | 10671 | 109329 | 20000 | + | lp2 | USD | ETH/MAR22 | 10671 | 3829 | 125 | + + And the insurance pool balance should be "60394" for the market "ETH/MAR22" + # #increament in insurancepool: 60394-40269=20125 which is coming from SLA penalty on lp1 and lp2 + + diff --git a/core/integration/main_test.go b/core/integration/main_test.go index fa686c0844a..89dc2b57c7a 100644 --- a/core/integration/main_test.go +++ b/core/integration/main_test.go @@ -28,6 +28,7 @@ import ( "code.vegaprotocol.io/vega/core/integration/steps" "code.vegaprotocol.io/vega/core/netparams" "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/libs/ptr" "code.vegaprotocol.io/vega/protos/vega" "github.com/cucumber/godog" @@ -400,13 +401,13 @@ func InitializeScenario(s *godog.ScenarioContext) { return steps.PartiesShouldHaveTheFollowingStakingAccountBalances(execsetup.stakingAccount, table) }) s.Step(`^the parties should have the following account balances:$`, func(table *godog.Table) error { - return steps.PartiesShouldHaveTheFollowingAccountBalances(execsetup.broker, table) + return steps.PartiesShouldHaveTheFollowingAccountBalances(execsetup.executionEngine, execsetup.broker, table) }) s.Step(`^the parties should have the following margin levels:$`, func(table *godog.Table) error { return steps.ThePartiesShouldHaveTheFollowingMarginLevels(execsetup.broker, table) }) s.Step(`^the parties should have the following profit and loss:$`, func(table *godog.Table) error { - return steps.PartiesHaveTheFollowingProfitAndLoss(execsetup.positionPlugin, table) + return steps.PartiesHaveTheFollowingProfitAndLoss(execsetup.executionEngine, execsetup.positionPlugin, table) }) s.Step(`^the order book should have the following volumes for market "([^"]*)":$`, func(marketID string, table *godog.Table) error { return steps.TheOrderBookOfMarketShouldHaveTheFollowingVolumes(execsetup.broker, marketID, table) @@ -466,7 +467,7 @@ func InitializeScenario(s *godog.ScenarioContext) { return steps.TheFollowingNetworkTradesShouldBeExecuted(execsetup.broker, table) }) s.Step(`^the following trades should be executed:$`, func(table *godog.Table) error { - return steps.TheFollowingTradesShouldBeExecuted(execsetup.broker, table) + return steps.TheFollowingTradesShouldBeExecuted(execsetup.executionEngine, execsetup.broker, table) }) s.Step(`^the trading mode should be "([^"]*)" for the market "([^"]*)"$`, func(tradingMode, marketID string) error { return steps.TheTradingModeShouldBeForMarket(execsetup.executionEngine, marketID, tradingMode) @@ -493,7 +494,7 @@ func InitializeScenario(s *godog.ScenarioContext) { return steps.TheTransfersOfFollowingTypesShouldHappen(execsetup.broker, table) }) s.Step(`^the following transfers should happen:$`, func(table *godog.Table) error { - return steps.TheFollowingTransfersShouldHappen(execsetup.broker, table) + return steps.TheFollowingTransfersShouldHappen(execsetup.broker, execsetup.executionEngine, table) }) s.Step(`^the mark price should be "([^"]*)" for the market "([^"]*)"$`, func(rawMarkPrice, marketID string) error { return steps.TheMarkPriceForTheMarketIs(execsetup.executionEngine, marketID, rawMarkPrice) @@ -587,6 +588,41 @@ func InitializeScenario(s *godog.ScenarioContext) { s.Step(`the average fill price is:`, func(table *godog.Table) error { return steps.TheAverageFillPriceIs(execsetup.executionEngine, table) }) + // AMM steps + s.Step(`^the parties submit the following AMM:$`, func(table *godog.Table) error { + return steps.PartiesSubmitTheFollowingAMMs(execsetup.executionEngine, table) + }) + s.Step(`^the parties amend the following AMM:$`, func(table *godog.Table) error { + return steps.PartiesAmendTheFollowingAMMs(execsetup.executionEngine, table) + }) + s.Step(`^the parties cancel the following AMM:$`, func(table *godog.Table) error { + return steps.PartiesCancelTheFollowingAMMs(execsetup.executionEngine, table) + }) + s.Step(`^the AMM pool status should be:$`, func(table *godog.Table) error { + return steps.AMMPoolStatusShouldBe(execsetup.broker, table) + }) + s.Step(`^the following AMM pool events should be emitted:$`, func(table *godog.Table) error { + return steps.ExpectToSeeAMMEvents(execsetup.broker, table) + }) + s.Step(`^set the following AMM sub account aliases:$`, func(table *godog.Table) error { + return steps.SetAMMSubAccountAlias(execsetup.broker, execsetup.executionEngine, table) + }) + s.Step(`^parties have the following AMM account balances:$`, func(table *godog.Table) error { + return steps.PartiesHaveTheFollowingAMMBalances(execsetup.broker, execsetup.executionEngine, table) + }) + // AMM specific debugging + s.Step(`^debug all AMM pool events$`, func() error { + return steps.DebugAMMPoolEvents(execsetup.broker, execsetup.log) + }) + s.Step(`^debug AMM pool events for party "([^"]+)"$`, func(party string) error { + return steps.DebugAMMPoolEventsForPartyMarket(execsetup.broker, execsetup.log, ptr.From(party), nil) + }) + s.Step(`^debug all AMM pool events for market "([^"]+)"$`, func(market string) error { + return steps.DebugAMMPoolEventsForPartyMarket(execsetup.broker, execsetup.log, nil, ptr.From(market)) + }) + s.Step(`^debug all AMM pool events for market "([^"]+)" and party "([^"]+)"$`, func(market, party string) error { + return steps.DebugAMMPoolEventsForPartyMarket(execsetup.broker, execsetup.log, ptr.From(party), ptr.From(market)) + }) // Debug steps s.Step(`^debug accounts$`, func() error { @@ -717,11 +753,18 @@ func InitializeScenario(s *godog.ScenarioContext) { s.Step(`^the party "([^"]*)" has the following discount factor "([^"]*)"$`, func(party, discountFactor string) error { return steps.PartyHasTheFollowingDiscountFactor(party, discountFactor, execsetup.volumeDiscountProgram) }) + s.Step(`^the AMM "([^"]*)" has the following discount factor "([^"]*)"$`, func(alias, discountFactor string) error { + return steps.AMMHasTheFollowingDiscountFactor(execsetup.executionEngine, execsetup.volumeDiscountProgram, alias, discountFactor) + }) s.Step(`^the party "([^"]*)" has the following taker notional "([^"]*)"$`, func(party, notional string) error { return steps.PartyHasTheFollowingTakerNotional(party, notional, execsetup.volumeDiscountProgram) }) + s.Step(`^the AMM "([^"]+)" has the following taker notional "([^"]+)"$`, func(alias, notional string) error { + return steps.AMMHasTheFollowingNotionalValue(execsetup.executionEngine, execsetup.volumeDiscountProgram, alias, notional) + }) + s.Step(`^create the network treasury account for asset "([^"]*)"$`, func(asset string) error { return steps.CreateNetworkTreasuryAccount(execsetup.collateralEngine, asset) }) diff --git a/core/integration/setup_test.go b/core/integration/setup_test.go index 89ab69ca32f..44f8c264ed9 100644 --- a/core/integration/setup_test.go +++ b/core/integration/setup_test.go @@ -527,5 +527,13 @@ func (e *executionTestSetup) registerNetParamsCallbacks() error { Param: netparams.MinEpochsInTeamForMetricRewardEligibility, Watcher: execsetup.marketActivityTracker.OnMinEpochsInTeamForRewardEligibilityUpdated, }, + netparams.WatchParam{ + Param: netparams.MarketLiquidityEquityLikeShareFeeFraction, + Watcher: execsetup.executionEngine.OnMarketLiquidityEquityLikeShareFeeFractionUpdate, + }, + netparams.WatchParam{ + Param: netparams.MarketAMMMinCommitmentQuantum, + Watcher: execsetup.executionEngine.OnMarketAMMMinCommitmentQuantum, + }, ) } diff --git a/core/integration/steps/amm_accounts.go b/core/integration/steps/amm_accounts.go new file mode 100644 index 00000000000..a43816ff3a3 --- /dev/null +++ b/core/integration/steps/amm_accounts.go @@ -0,0 +1,70 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package steps + +import ( + "fmt" + + "code.vegaprotocol.io/vega/core/integration/stubs" + + "github.com/cucumber/godog" +) + +func PartiesHaveTheFollowingAMMBalances(broker *stubs.BrokerStub, exec Execution, table *godog.Table) error { + for _, r := range parseAMMAccountTable(table) { + row := ammAccRow{ + r: r, + } + alias := row.alias() + id, ok := exec.GetAMMSubAccountID(alias) + if !ok { + return fmt.Errorf("alias %s for AMM sub account does not exist", alias) + } + acc, err := broker.GetPartyGeneralAccount(id, row.asset()) + if err != nil { + return fmt.Errorf("account alias %s (ID %s) for asset %s does not exist: %v", alias, id, row.asset(), err) + } + if bal := row.balance(); acc.Balance != bal { + return fmt.Errorf("account alias %s (ID %s) for asset %s: expected balance %s - instead got %s", alias, id, row.asset(), bal, acc.Balance) + } + } + return nil +} + +type ammAccRow struct { + r RowWrapper +} + +func parseAMMAccountTable(table *godog.Table) []RowWrapper { + // add party and market to make the account lookup easier + return StrictParseTable(table, []string{ + "account alias", + "balance", + "asset", + }, nil) +} + +func (a ammAccRow) alias() string { + return a.r.MustStr("account alias") +} + +func (a ammAccRow) balance() string { + return a.r.MustStr("balance") +} + +func (a ammAccRow) asset() string { + return a.r.MustStr("asset") +} diff --git a/core/integration/steps/amm_events.go b/core/integration/steps/amm_events.go new file mode 100644 index 00000000000..bf7b85f0fbe --- /dev/null +++ b/core/integration/steps/amm_events.go @@ -0,0 +1,232 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package steps + +import ( + "fmt" + + "code.vegaprotocol.io/vega/core/events" + "code.vegaprotocol.io/vega/core/integration/stubs" + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/logging" + + "github.com/cucumber/godog" +) + +func AMMPoolStatusShouldBe(broker *stubs.BrokerStub, table *godog.Table) error { + recent := broker.GetLastAMMPoolEvents() + for _, r := range parseAMMEventTable(table) { + row := ammEvtRow{ + r: r, + } + mID, pID := row.market(), row.party() + mmap, ok := recent[mID] + if !ok { + return fmt.Errorf("no AMM events found for market %s", mID) + } + pEvt, ok := mmap[pID] + if !ok { + return fmt.Errorf("no AMM events found for party %s in market %s", pID, mID) + } + if err := row.matchesEvt(pEvt); err != nil { + return err + } + } + return nil +} + +func ExpectToSeeAMMEvents(broker *stubs.BrokerStub, table *godog.Table) error { + evtMap := broker.GetAMMPoolEventMap() + for _, r := range parseAMMEventTable(table) { + row := ammEvtRow{ + r: r, + } + mID, pID := row.market(), row.party() + mmap, ok := evtMap[mID] + if !ok { + return fmt.Errorf("no AMM events found for market %s", mID) + } + pEvts, ok := mmap[pID] + if !ok { + return fmt.Errorf("no AMM events found for party %s in market %s", pID, mID) + } + var err error + for _, e := range pEvts { + if err = row.matchesEvt(e); err == nil { + break + } + } + if err != nil { + return fmt.Errorf("expected AMM event for party %s on market %s not found, last AMM pool event mismatch: %v", pID, mID, err) + } + } + return nil +} + +func SetAMMSubAccountAlias(broker *stubs.BrokerStub, exec Execution, table *godog.Table) error { + // get the most recent event by market and party + recent := broker.GetLastAMMPoolEvents() + for _, r := range parseAMMAccountAlias(table) { + row := ammEvtRow{ + r: r, + } + mID, pID := row.market(), row.party() + mmap, ok := recent[mID] + if !ok { + return fmt.Errorf("no AMM events found for market %s", mID) + } + pEvt, ok := mmap[pID] + if !ok { + return fmt.Errorf("no AMM event found for party %s in market %s", pID, mID) + } + acc := pEvt.AMMPool().SubAccount + exec.SetAMMSubAccountIDAlias(row.alias(), acc) + } + return nil +} + +type ammEvtRow struct { + r RowWrapper +} + +func parseAMMAccountAlias(table *godog.Table) []RowWrapper { + return StrictParseTable(table, []string{ + "party", + "market id", + "alias", + }, nil) +} + +func parseAMMEventTable(table *godog.Table) []RowWrapper { + return StrictParseTable(table, []string{ + "party", + "market id", + "amount", + "status", + }, []string{ + "reason", + "base", + "lower bound", + "upper bound", + "lower margin ratio", + "upper margin ratio", + }) +} + +func DebugAMMPoolEvents(broker *stubs.BrokerStub, log *logging.Logger) error { + evts := broker.GetAMMPoolEvents() + logEvents(log, evts) + return nil +} + +func DebugAMMPoolEventsForPartyMarket(broker *stubs.BrokerStub, log *logging.Logger, party, market *string) error { + if party == nil && market == nil { + return DebugAMMPoolEvents(broker, log) + } + if market == nil { + logEvents(log, broker.GetAMMPoolEventsByParty(*party)) + return nil + } + if party == nil { + logEvents(log, broker.GetAMMPoolEventsByMarket(*market)) + return nil + } + logEvents(log, broker.GetAMMPoolEventsByPartyAndMarket(*party, *market)) + return nil +} + +func logEvents(log *logging.Logger, evts []*events.AMMPool) { + for _, e := range evts { + pool := e.AMMPool() + if pool.Parameters == nil { + log.Info(fmt.Sprintf("AMM Party: %s on Market: %s - Amount: %s - no parameters", pool.PartyId, pool.MarketId, pool.Commitment)) + continue + } + log.Info(fmt.Sprintf( + "AMM Party: %s on Market: %s - Amount: %s\nStatus: %s, Reason: %s\n Base: %s, Bounds: %s-%s, Margin ratios: %s-%s", + pool.PartyId, pool.MarketId, pool.Commitment, + pool.Status.String(), pool.StatusReason.String(), + pool.Parameters.Base, pool.Parameters.LowerBound, pool.Parameters.UpperBound, + pool.Parameters.MarginRatioAtLowerBound, pool.Parameters.MarginRatioAtUpperBound, + )) + } +} + +func (a ammEvtRow) matchesEvt(e *events.AMMPool) error { + pool := e.AMMPool() + + if pool.PartyId != a.party() || pool.MarketId != a.market() || pool.Commitment != a.r.MustStr("amount") || pool.Status != a.status() { + return fmt.Errorf( + "expected party %s, market %s, amount %s, status %s - instead got %s, %s, %s, %s", + a.party(), a.market(), a.r.MustStr("amount"), a.status().String(), + pool.PartyId, pool.MarketId, pool.Commitment, pool.Status.String(), + ) + } + got := make([]any, 0, 10) + got = append(got, pool.PartyId, pool.MarketId, pool.Commitment, pool.Status.String()) + eFmt := "mismatch for %s, %s, %s, %s" + if psr, check := a.reason(); check { + if pool.StatusReason != psr { + got = append(got, psr.String, pool.StatusReason.String()) + return fmt.Errorf(eFmt+" expected reason %s - instead got %s", got...) + } + got = append(got, psr.String()) + eFmt = eFmt + ", %s" + } + checks := map[string]string{ + "base": pool.Parameters.Base, + "lower bound": pool.Parameters.LowerBound, + "upper bound": pool.Parameters.UpperBound, + "lower margin ratio": pool.Parameters.MarginRatioAtLowerBound, + "upper margin ratio": pool.Parameters.MarginRatioAtUpperBound, + } + for name, val := range checks { + if !a.r.HasColumn(name) { + continue + } + if exp := a.r.MustStr(name); val != exp { + got = append(got, name, exp, val) + return fmt.Errorf(eFmt+" expected %s %s - instead got %s", got...) + } + got = append(got, val) + eFmt = eFmt + ", %s" + } + return nil +} + +func (a ammEvtRow) party() string { + return a.r.MustStr("party") +} + +func (a ammEvtRow) market() string { + return a.r.MustStr("market id") +} + +func (a ammEvtRow) status() types.AMMPoolStatus { + return a.r.MustAMMPoolStatus("status") +} + +func (a ammEvtRow) reason() (types.AMMPoolStatusReason, bool) { + if !a.r.HasColumn("reason") { + return types.AMMPoolStatusReasonUnspecified, false + } + sr := a.r.MustPoolStatusReason("reason") + return sr, true +} + +func (a ammEvtRow) alias() string { + return a.r.MustStr("alias") +} diff --git a/core/integration/steps/amm_submission.go b/core/integration/steps/amm_submission.go new file mode 100644 index 00000000000..9052b33f658 --- /dev/null +++ b/core/integration/steps/amm_submission.go @@ -0,0 +1,291 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package steps + +import ( + "context" + "fmt" + + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/libs/ptr" + + "github.com/cucumber/godog" +) + +func PartiesSubmitTheFollowingAMMs(exec Execution, table *godog.Table) error { + ctx := context.Background() + for _, r := range parseSubmitAMMTable(table) { + row := ammRow{ + r: r, + } + fail, eStr := row.err() + if err := exec.SubmitAMM(ctx, row.toSubmission()); err != nil { + if !fail { + return err + } + if err.Error() != eStr { + return fmt.Errorf("expected error %s, instead got: %s (%v)", eStr, err.Error(), err) + } + } + } + return nil +} + +func PartiesAmendTheFollowingAMMs(exec Execution, table *godog.Table) error { + ctx := context.Background() + for _, r := range parseAmendAMMTable(table) { + row := ammRow{ + r: r, + isAmend: true, + } + fail, eStr := row.err() + if err := exec.AmendAMM(ctx, row.toAmendment()); err != nil { + if !fail { + return err + } + if err.Error() != eStr { + return fmt.Errorf("expected error %s, instead got: %s (%v)", eStr, err.Error(), err) + } + } + } + return nil +} + +func PartiesCancelTheFollowingAMMs(exec Execution, table *godog.Table) error { + ctx := context.Background() + for _, r := range parseCancelAMMTable(table) { + row := ammRow{ + r: r, + } + fail, eStr := row.err() + if err := exec.CancelAMM(ctx, row.toCancel()); err != nil { + if !fail { + return err + } + if err.Error() != eStr { + return fmt.Errorf("expected error %s, instead got: %s (%v)", eStr, err.Error(), err) + } + } + } + return nil +} + +func parseSubmitAMMTable(table *godog.Table) []RowWrapper { + return StrictParseTable(table, []string{ + "party", // str + "market id", // str + "amount", // uint + "slippage", // dec + "base", // uint + "proposed fee", // dec + }, []string{ + "lower bound", // uint + "upper bound", // uint + "lower margin ratio", // dec + "upper margin ratio", // dec + "error", + }) +} + +func parseAmendAMMTable(table *godog.Table) []RowWrapper { + return StrictParseTable(table, []string{ + "party", // str + "market id", // str + "slippage", // dec + }, []string{ + "proposed fee", // dec + "amount", // uint + "base", // uint + "lower bound", // uint + "upper bound", // uint + "lower margin ratio", // dec + "upper margin ratio", // dec + "error", + }) +} + +func parseCancelAMMTable(table *godog.Table) []RowWrapper { + return StrictParseTable(table, []string{ + "party", + "market id", + "method", + }, []string{ + "error", + }) +} + +type ammRow struct { + r RowWrapper + isAmend bool +} + +func (a ammRow) toSubmission() *types.SubmitAMM { + reqPairs := [][2]string{ + {"lower bound", "lower margin ratio"}, + {"upper bound", "upper margin ratio"}, + } + // at least one of the pairs is required + hasOne := false + for _, pair := range reqPairs { + if req := a.r.HasColumn(pair[0]); req != a.r.HasColumn(pair[1]) { + panic(fmt.Sprintf("values for %s and %s should be provided in pairs", pair[0], pair[1])) + } else if req { + hasOne = true + } + } + if !hasOne { + panic("required at least one pair of bound parameters (upper/lower bound + margin ratio)") + } + return &types.SubmitAMM{ + AMMBaseCommand: types.AMMBaseCommand{ + MarketID: a.marketID(), + Party: a.party(), + SlippageTolerance: a.slippage(), + ProposedFee: a.proposedFee(), + }, + CommitmentAmount: a.amount(), + Parameters: &types.ConcentratedLiquidityParameters{ + Base: a.base(), + LowerBound: a.lowerBound(), + UpperBound: a.upperBound(), + MarginRatioAtLowerBound: a.lowerMargin(), + MarginRatioAtUpperBound: a.upperMargin(), + }, + } +} + +func (a ammRow) toAmendment() *types.AmendAMM { + ret := &types.AmendAMM{ + AMMBaseCommand: types.AMMBaseCommand{ + MarketID: a.marketID(), + Party: a.party(), + SlippageTolerance: a.slippage(), + ProposedFee: a.proposedFee(), + }, + } + if a.r.HasColumn("amount") { + ret.CommitmentAmount = a.amount() + } + params := &types.ConcentratedLiquidityParameters{} + paramSet := false + if a.r.HasColumn("base") { + params.Base = a.base() + paramSet = true + } + if a.r.HasColumn("lower bound") { + params.LowerBound = a.lowerBound() + paramSet = true + } + if a.r.HasColumn("upper bound") { + params.UpperBound = a.upperBound() + paramSet = true + } + if a.r.HasColumn("lower margin ratio") { + params.MarginRatioAtLowerBound = a.lowerMargin() + paramSet = true + } + if a.r.HasColumn("upper margin ratio") { + params.MarginRatioAtUpperBound = a.upperMargin() + paramSet = true + } + if paramSet { + ret.Parameters = params + } + return ret +} + +func (a ammRow) toCancel() *types.CancelAMM { + return &types.CancelAMM{ + MarketID: a.marketID(), + Party: a.party(), + Method: a.method(), + } +} + +func (a ammRow) party() string { + return a.r.MustStr("party") +} + +func (a ammRow) marketID() string { + return a.r.MustStr("market id") +} + +func (a ammRow) proposedFee() num.Decimal { + if !a.isAmend { + return a.r.MustDecimal("proposed fee") + } + + if a.r.HasColumn("proposed fee") { + return a.r.MustDecimal("proposed fee") + } + return num.DecimalZero() +} + +func (a ammRow) amount() *num.Uint { + return a.r.MustUint("amount") +} + +func (a ammRow) slippage() num.Decimal { + return a.r.MustDecimal("slippage") +} + +func (a ammRow) base() *num.Uint { + return a.r.MustUint("base") +} + +func (a ammRow) lowerBound() *num.Uint { + if !a.r.HasColumn("lower bound") { + return nil + } + return a.r.MustUint("lower bound") +} + +func (a ammRow) upperBound() *num.Uint { + if !a.r.HasColumn("upper bound") { + return nil + } + return a.r.MustUint("upper bound") +} + +func (a ammRow) lowerMargin() *num.Decimal { + if !a.r.HasColumn("lower bound") { + return nil + } + return ptr.From(a.r.MustDecimal("lower margin ratio")) +} + +func (a ammRow) upperMargin() *num.Decimal { + if !a.r.HasColumn("upper bound") { + return nil + } + return ptr.From(a.r.MustDecimal("upper margin ratio")) +} + +func (a ammRow) method() types.AMMPoolCancellationMethod { + if !a.r.HasColumn("method") { + return types.AMMPoolCancellationMethodUnspecified + } + return a.r.MustAMMCancelationMethod("method") +} + +func (a ammRow) err() (bool, string) { + if !a.r.HasColumn("error") { + return false, "" + } + str := a.r.MustStr("error") + return true, str +} diff --git a/core/integration/steps/execution.go b/core/integration/steps/execution.go index 064a47ebe20..eee1bbaaf6a 100644 --- a/core/integration/steps/execution.go +++ b/core/integration/steps/execution.go @@ -57,4 +57,11 @@ type Execution interface { OnEpochEvent(ctx context.Context, epoch types.Epoch) UpdateMarketState(ctx context.Context, changes *types.MarketStateUpdateConfiguration) error UpdateMarginMode(ctx context.Context, party, marketID string, marginMode types.MarginMode, marginFactor num.Decimal) error + + // AMM stuff + SubmitAMM(ctx context.Context, submit *types.SubmitAMM) error + AmendAMM(ctx context.Context, submit *types.AmendAMM) error + CancelAMM(ctx context.Context, cancel *types.CancelAMM) error + GetAMMSubAccountID(alias string) (string, bool) + SetAMMSubAccountIDAlias(alias, id string) } diff --git a/core/integration/steps/network_params.go b/core/integration/steps/network_params.go index 2385b6c4770..1826c1c067f 100644 --- a/core/integration/steps/network_params.go +++ b/core/integration/steps/network_params.go @@ -68,6 +68,11 @@ func TheFollowingNetworkParametersAreSet(netParams *netparams.Store, table *godo if err := netParams.Update(ctx, netparams.InternalCompositePriceUpdateFrequency, str); err != nil { return err } + case netparams.MarketLiquidityEquityLikeShareFeeFraction: + dv := row.MustDecimal("value") + if err := netParams.Update(ctx, netparams.MarketLiquidityEquityLikeShareFeeFraction, dv.String()); err != nil { + return err + } default: value := row.MustStr("value") if err := netParams.Update(ctx, name, value); err != nil { diff --git a/core/integration/steps/parties_should_have_the_following_account_balances.go b/core/integration/steps/parties_should_have_the_following_account_balances.go index dd2de75d254..3635f350cde 100644 --- a/core/integration/steps/parties_should_have_the_following_account_balances.go +++ b/core/integration/steps/parties_should_have_the_following_account_balances.go @@ -24,6 +24,7 @@ import ( ) func PartiesShouldHaveTheFollowingAccountBalances( + exec Execution, broker *stubs.BrokerStub, table *godog.Table, ) error { @@ -32,15 +33,23 @@ func PartiesShouldHaveTheFollowingAccountBalances( expectedValues := map[string]string{} foundValues := map[string]string{} + party := row.Party() + if row.IsAMM() { + id, ok := exec.GetAMMSubAccountID(party) + if !ok { + return errAMMAliasNotFound(party) + } + party = id + } expectedAsset := row.Asset() if row.ExpectGeneralAccountBalance() && len(row.GeneralAccountBalance()) > 0 { - generalAccount, err := broker.GetPartyGeneralAccount(row.Party(), expectedAsset) + generalAccount, err := broker.GetPartyGeneralAccount(party, expectedAsset) if err != nil { - return errCannotGetPartyGeneralAccount(row.Party(), expectedAsset, err) + return errCannotGetPartyGeneralAccount(party, expectedAsset, err) } if generalAccount.GetAsset() != expectedAsset { - return errWrongGeneralAccountAsset(row.Party(), expectedAsset, generalAccount.GetAsset()) + return errWrongGeneralAccountAsset(party, expectedAsset, generalAccount.GetAsset()) } foundBalance := generalAccount.GetBalance() @@ -55,12 +64,12 @@ func PartiesShouldHaveTheFollowingAccountBalances( if !row.ExpectMarketID() { return fmt.Errorf("market id must be specified when expected margin account balance is supplied") } - marginAccount, err := broker.GetPartyMarginAccount(row.Party(), row.MarketID()) + marginAccount, err := broker.GetPartyMarginAccount(party, row.MarketID()) if err != nil { - return errCannotGetPartyMarginAccount(row.Party(), row.MarketID(), err) + return errCannotGetPartyMarginAccount(party, row.MarketID(), err) } if marginAccount.GetAsset() != expectedAsset { - return errWrongMarketAccountAsset(marginAccount.GetType().String(), row.Party(), row.MarketID(), expectedAsset, marginAccount.GetAsset()) + return errWrongMarketAccountAsset(marginAccount.GetType().String(), party, row.MarketID(), expectedAsset, marginAccount.GetAsset()) } foundBalance := marginAccount.GetBalance() expectedBalance := row.MarginAccountBalance() @@ -74,12 +83,12 @@ func PartiesShouldHaveTheFollowingAccountBalances( if !row.ExpectMarketID() { return fmt.Errorf("market id must be specified when expected order margin account balance is supplied") } - orderMarginAccount, err := broker.GetPartyOrderMarginAccount(row.Party(), row.MarketID()) + orderMarginAccount, err := broker.GetPartyOrderMarginAccount(party, row.MarketID()) if err != nil { - return errCannotGetPartyOrderMarginAccount(row.Party(), row.MarketID(), err) + return errCannotGetPartyOrderMarginAccount(party, row.MarketID(), err) } if orderMarginAccount.GetAsset() != expectedAsset { - return errWrongMarketAccountAsset(orderMarginAccount.GetType().String(), row.Party(), row.MarketID(), expectedAsset, orderMarginAccount.GetAsset()) + return errWrongMarketAccountAsset(orderMarginAccount.GetType().String(), party, row.MarketID(), expectedAsset, orderMarginAccount.GetAsset()) } foundBalance := orderMarginAccount.GetBalance() expectedBalance := row.OrderMarginAccountBalance() @@ -94,12 +103,12 @@ func PartiesShouldHaveTheFollowingAccountBalances( if !row.ExpectMarketID() { return fmt.Errorf("market id must be specified when expected bond account balance is supplied") } - bondAcc, err := broker.GetPartyBondAccountForMarket(row.Party(), expectedAsset, row.MarketID()) + bondAcc, err := broker.GetPartyBondAccountForMarket(party, expectedAsset, row.MarketID()) if err != nil { - return errCannotGetPartyBondAccount(row.Party(), row.MarketID(), err) + return errCannotGetPartyBondAccount(party, row.MarketID(), err) } if bondAcc.GetAsset() != expectedAsset { - return errWrongMarketAccountAsset(bondAcc.GetType().String(), row.Party(), row.MarketID(), expectedAsset, bondAcc.GetAsset()) + return errWrongMarketAccountAsset(bondAcc.GetType().String(), party, row.MarketID(), expectedAsset, bondAcc.GetAsset()) } foundBalance := bondAcc.GetBalance() expectedBalance := row.BondAccountBalance() @@ -113,12 +122,12 @@ func PartiesShouldHaveTheFollowingAccountBalances( if !row.ExpectMarketID() { return fmt.Errorf("market id must be specified when expected bond account balance is supplied") } - vestingAcc, err := broker.GetPartyVestingAccountForMarket(row.Party(), expectedAsset, row.MarketID()) + vestingAcc, err := broker.GetPartyVestingAccountForMarket(party, expectedAsset, row.MarketID()) if err != nil { - return errCannotGetPartyVestingAccount(row.Party(), row.MarketID(), err) + return errCannotGetPartyVestingAccount(party, row.MarketID(), err) } if vestingAcc.GetAsset() != expectedAsset { - return errWrongMarketAccountAsset(vestingAcc.GetType().String(), row.Party(), row.MarketID(), expectedAsset, vestingAcc.GetAsset()) + return errWrongMarketAccountAsset(vestingAcc.GetType().String(), party, row.MarketID(), expectedAsset, vestingAcc.GetAsset()) } foundBalance := vestingAcc.GetBalance() expectedBalance := row.VestingAccountBalance() @@ -132,12 +141,12 @@ func PartiesShouldHaveTheFollowingAccountBalances( if !row.ExpectMarketID() { return fmt.Errorf("market id must be specified when expected bond account balance is supplied") } - vestedAcc, err := broker.GetPartyVestedAccountForMarket(row.Party(), expectedAsset, row.MarketID()) + vestedAcc, err := broker.GetPartyVestedAccountForMarket(party, expectedAsset, row.MarketID()) if err != nil { - return errCannotGetPartyVestedAccount(row.Party(), row.MarketID(), err) + return errCannotGetPartyVestedAccount(party, row.MarketID(), err) } if vestedAcc.GetAsset() != expectedAsset { - return errWrongMarketAccountAsset(vestedAcc.GetType().String(), row.Party(), row.MarketID(), expectedAsset, vestedAcc.GetAsset()) + return errWrongMarketAccountAsset(vestedAcc.GetType().String(), party, row.MarketID(), expectedAsset, vestedAcc.GetAsset()) } foundBalance := vestedAcc.GetBalance() expectedBalance := row.VestedAccountBalance() @@ -148,12 +157,16 @@ func PartiesShouldHaveTheFollowingAccountBalances( } if len(expectedValues) > 0 { - return formatDiff(fmt.Sprintf("account balances did not match for party %q", row.Party()), expectedValues, foundValues) + return formatDiff(fmt.Sprintf("account balances did not match for party %q", party), expectedValues, foundValues) } } return nil } +func errAMMAliasNotFound(party string) error { + return fmt.Errorf("couldn't find AMM alias %s", party) +} + func errCannotGetPartyGeneralAccount(party, asset string, err error) error { return fmt.Errorf("couldn't get general account for party(%s) and asset(%s): %w", party, asset, err, @@ -214,6 +227,7 @@ func parseAccountBalancesTable(table *godog.Table) []RowWrapper { "vesting", "vested", "order margin", + "is amm", }) } @@ -288,3 +302,10 @@ func (r accountBalancesRow) VestingAccountBalance() string { func (r accountBalancesRow) ExpectVestingAccountBalance() bool { return r.row.HasColumn("vesting") } + +func (r accountBalancesRow) IsAMM() bool { + if !r.row.HasColumn("is amm") { + return false + } + return r.row.MustBool("is amm") +} diff --git a/core/integration/steps/parties_should_have_the_following_profit_and_loss.go b/core/integration/steps/parties_should_have_the_following_profit_and_loss.go index 1398961dcff..3fe5c2d066e 100644 --- a/core/integration/steps/parties_should_have_the_following_profit_and_loss.go +++ b/core/integration/steps/parties_should_have_the_following_profit_and_loss.go @@ -28,19 +28,20 @@ import ( ) func PartiesHaveTheFollowingProfitAndLoss( + exec Execution, positionService *plugins.Positions, table *godog.Table, ) error { for _, r := range parseProfitAndLossTable(table) { row := pnlRow{row: r} - if err := positionAPIProduceTheFollowingRow(positionService, row); err != nil { + if err := positionAPIProduceTheFollowingRow(exec, positionService, row); err != nil { return err } } return nil } -func positionAPIProduceTheFollowingRow(positionService *plugins.Positions, row pnlRow) (err error) { +func positionAPIProduceTheFollowingRow(exec Execution, positionService *plugins.Positions, row pnlRow) (err error) { retries := 2 sleepTimeMs := 100 @@ -48,6 +49,14 @@ func positionAPIProduceTheFollowingRow(positionService *plugins.Positions, row p // check position status if needed ps, checkPS := row.positionState() party := row.party() + readableParty := party + if row.isAMM() { + id, ok := exec.GetAMMSubAccountID(party) + if !ok { + return errCannotGetPositionForParty(party, fmt.Errorf("vAMM alias %s not found", party)) + } + party = id + } for retries > 0 { if len(row.market()) > 0 { p, err := positionService.GetPositionsByMarketAndParty(row.market(), party) @@ -56,7 +65,7 @@ func positionAPIProduceTheFollowingRow(positionService *plugins.Positions, row p if row.volume() == 0 && row.realisedPNL().IsZero() && row.unrealisedPNL().IsZero() { return nil } - return errCannotGetPositionForParty(party, err) + return errCannotGetPositionForParty(readableParty, err) } } else { pos, err = positionService.GetPositionsByParty(party) @@ -66,7 +75,7 @@ func positionAPIProduceTheFollowingRow(positionService *plugins.Positions, row p if row.volume() == 0 && row.realisedPNL().IsZero() && row.unrealisedPNL().IsZero() { return nil } - return errCannotGetPositionForParty(party, err) + return errCannotGetPositionForParty(readableParty, err) } if areSamePosition(pos, row) { @@ -95,6 +104,9 @@ func positionAPIProduceTheFollowingRow(positionService *plugins.Positions, row p } func errProfitAndLossValuesForParty(pos []*types.Position, row pnlRow) error { + if pos[0] == nil { + pos[0] = &types.Position{} + } return formatDiff( fmt.Sprintf("invalid positions values for party(%v)", row.party()), map[string]string{ @@ -134,6 +146,7 @@ func parseProfitAndLossTable(table *godog.Table) []RowWrapper { }, []string{ "status", "market id", + "is amm", }) } @@ -171,3 +184,10 @@ func (r pnlRow) positionState() (vega.PositionStatus, bool) { } return r.row.MustPositionStatus("status"), true } + +func (r pnlRow) isAMM() bool { + if !r.row.HasColumn("is amm") { + return false + } + return r.row.MustBool("is amm") +} diff --git a/core/integration/steps/table_wrapper.go b/core/integration/steps/table_wrapper.go index 319885bdac3..d201517c7ef 100644 --- a/core/integration/steps/table_wrapper.go +++ b/core/integration/steps/table_wrapper.go @@ -27,7 +27,9 @@ import ( "code.vegaprotocol.io/vega/libs/num" "code.vegaprotocol.io/vega/libs/ptr" proto "code.vegaprotocol.io/vega/protos/vega" + commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" datav1 "code.vegaprotocol.io/vega/protos/vega/data/v1" + eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" "github.com/cucumber/godog" "github.com/cucumber/messages-go/v16" @@ -811,6 +813,48 @@ func (r RowWrapper) DurationSec(name string) time.Duration { return time.Duration(n) * time.Second } +func (r RowWrapper) MustAMMCancelationMethod(name string) types.AMMPoolCancellationMethod { + cancelMethod, err := AMMCancelMethod(r.MustStr(name)) + panicW(name, err) + return cancelMethod +} + +func (r RowWrapper) MustAMMPoolStatus(name string) types.AMMPoolStatus { + ps, err := AMMPoolStatus(r.MustStr(name)) + panicW(name, err) + return ps +} + +func (r RowWrapper) MustPoolStatusReason(name string) types.AMMPoolStatusReason { + pr, err := AMMPoolStatusReason(r.MustStr(name)) + panicW(name, err) + return pr +} + +func AMMCancelMethod(rawValue string) (types.AMMPoolCancellationMethod, error) { + ty, ok := commandspb.CancelAMM_Method_value[rawValue] + if !ok { + return types.AMMPoolCancellationMethod(ty), fmt.Errorf("invalid cancelation method: %v", rawValue) + } + return types.AMMPoolCancellationMethod(ty), nil +} + +func AMMPoolStatus(rawValue string) (types.AMMPoolStatus, error) { + ps, ok := eventspb.AMMPool_Status_value[rawValue] + if !ok { + return types.AMMPoolStatusUnspecified, fmt.Errorf("invalid AMM pool status: %s", rawValue) + } + return types.AMMPoolStatus(ps), nil +} + +func AMMPoolStatusReason(rawValue string) (types.AMMPoolStatusReason, error) { + pr, ok := eventspb.AMMPool_StatusReason_value[rawValue] + if !ok { + return types.AMMPoolStatusReasonUnspecified, fmt.Errorf("invalid AMM pool status reason: %s", rawValue) + } + return types.AMMPoolStatusReason(pr), nil +} + func panicW(field string, err error) { if err != nil { panic(fmt.Sprintf("couldn't parse %s: %v", field, err)) diff --git a/core/integration/steps/the_following_trades_happened.go b/core/integration/steps/the_following_trades_happened.go index 247b54aea6e..08316da06e3 100644 --- a/core/integration/steps/the_following_trades_happened.go +++ b/core/integration/steps/the_following_trades_happened.go @@ -27,6 +27,7 @@ import ( ) func TheFollowingTradesShouldBeExecuted( + exec Execution, broker *stubs.BrokerStub, table *godog.Table, ) error { @@ -34,7 +35,9 @@ func TheFollowingTradesShouldBeExecuted( for _, row := range parseExecutedTradesTable(table) { buyer := row.MustStr("buyer") + buyerIn := buyer seller := row.MustStr("seller") + sellerIn := seller price := row.MustU64("price") size := row.MustU64("size") aggressorRaw := row.Str("aggressor side") @@ -42,6 +45,15 @@ func TheFollowingTradesShouldBeExecuted( if aggressorRaw != "" && aerr != nil { return aerr } + // remap buyer/seller to AMM IDs + if row.HasColumn("is amm") && row.MustBool("is amm") { + if id, ok := exec.GetAMMSubAccountID(buyer); ok { + buyer = id + } + if id, ok := exec.GetAMMSubAccountID(seller); ok { + seller = id + } + } buyerFee, hasBuyerFee := row.U64B("buyer fee") buyerInfraFee, hasBuyerInfraFee := row.U64B("buyer infrastructure fee") @@ -97,7 +109,7 @@ func TheFollowingTradesShouldBeExecuted( } } if !found { - return errMissingTrade(buyer, seller, price, size) + return errMissingTrade(buyerIn, sellerIn, price, size) } } return err @@ -140,6 +152,7 @@ func parseExecutedTradesTable(table *godog.Table) []RowWrapper { "seller infrastructure fee referrer discount", "seller liquidity fee referrer discount", "seller maker fee referrer discount", + "is amm", }) } diff --git a/core/integration/steps/the_following_transfers_should_happen.go b/core/integration/steps/the_following_transfers_should_happen.go index ffa8140fdea..c4d65aced52 100644 --- a/core/integration/steps/the_following_transfers_should_happen.go +++ b/core/integration/steps/the_following_transfers_should_happen.go @@ -27,12 +27,27 @@ import ( func TheFollowingTransfersShouldHappen( broker *stubs.BrokerStub, + exec Execution, table *godog.Table, ) error { transfers := broker.GetTransfers(true) for _, r := range parseTransferTable(table) { row := transferRow{row: r} + if row.IsAMM() { + found := false + if id, ok := exec.GetAMMSubAccountID(row.From()); ok { + row.row.values["from"] = id + found = true + } + if id, ok := exec.GetAMMSubAccountID(row.To()); ok { + row.row.values["to"] = id + found = true + } + if !found { + return fmt.Errorf("no AMM aliases found for from (%s) or to (%s)", row.From(), row.To()) + } + } matched, divergingAmounts := matchTransfers(transfers, row) @@ -96,6 +111,7 @@ func parseTransferTable(table *godog.Table) []RowWrapper { "asset", }, []string{ "type", + "is amm", }) } @@ -147,3 +163,10 @@ func (r transferRow) Amount() uint64 { func (r transferRow) Asset() string { return r.row.MustStr("asset") } + +func (r transferRow) IsAMM() bool { + if !r.row.HasColumn("is amm") { + return false + } + return r.row.MustBool("is amm") +} diff --git a/core/integration/steps/transfers.go b/core/integration/steps/transfers.go index 20293a45fd1..0394a00eca5 100644 --- a/core/integration/steps/transfers.go +++ b/core/integration/steps/transfers.go @@ -232,6 +232,8 @@ func rowToRecurringTransfer(r RowWrapper) *types.RecurringTransfer { indiScope = proto.IndividualScope_INDIVIDUAL_SCOPE_IN_TEAM } else if indiScopeStr == "NOT_IN_TEAM" { indiScope = proto.IndividualScope_INDIVIDUAL_SCOPE_NOT_IN_TEAM + } else if indiScopeStr == "INDIVIDUAL_SCOPE_AMM" { + indiScope = proto.IndividualScope_INDIVIDUAL_SCOPE_AMM } } } diff --git a/core/integration/steps/volume_discount_program.go b/core/integration/steps/volume_discount_program.go index 4862b6f789b..e8d8f4eafc7 100644 --- a/core/integration/steps/volume_discount_program.go +++ b/core/integration/steps/volume_discount_program.go @@ -137,3 +137,20 @@ func PartyHasTheFollowingTakerNotional(party, notional string, vde *volumediscou } return nil } + +func AMMHasTheFollowingNotionalValue(exec Execution, vde *volumediscount.Engine, alias, value string) error { + id, ok := exec.GetAMMSubAccountID(alias) + if !ok { + return fmt.Errorf("unknown vAMM alias %s", alias) + } + // from this point, it's the same as for a normal party + return PartyHasTheFollowingTakerNotional(id, value, vde) +} + +func AMMHasTheFollowingDiscountFactor(exec Execution, vde *volumediscount.Engine, alias, factor string) error { + id, ok := exec.GetAMMSubAccountID(alias) + if !ok { + return fmt.Errorf("unknown vAMM alias %s", alias) + } + return PartyHasTheFollowingDiscountFactor(id, factor, vde) +} diff --git a/core/integration/stubs/broker_stub.go b/core/integration/stubs/broker_stub.go index 538a61d3c4e..2269f146728 100644 --- a/core/integration/stubs/broker_stub.go +++ b/core/integration/stubs/broker_stub.go @@ -24,6 +24,7 @@ import ( "code.vegaprotocol.io/vega/core/events" "code.vegaprotocol.io/vega/core/types" "code.vegaprotocol.io/vega/libs/broker" + "code.vegaprotocol.io/vega/libs/ptr" proto "code.vegaprotocol.io/vega/protos/vega" vegapb "code.vegaprotocol.io/vega/protos/vega" eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" @@ -1298,6 +1299,90 @@ func (b *BrokerStub) GetTrades() []vegapb.Trade { return trades } +// AMM events concentrated here + +func (b *BrokerStub) GetAMMPoolEvents() []*events.AMMPool { + data := b.GetImmBatch(events.AMMPoolEvent) + ret := make([]*events.AMMPool, 0, len(data)) + for _, e := range data { + switch et := e.(type) { + case events.AMMPool: + ret = append(ret, ptr.From(et)) + case *events.AMMPool: + ret = append(ret, et) + } + } + return ret +} + +func (b *BrokerStub) GetAMMPoolEventsByParty(party string) []*events.AMMPool { + evts := b.GetAMMPoolEvents() + ret := make([]*events.AMMPool, 0, 5) // we expect to get more than 1 + for _, e := range evts { + if e.IsParty(party) { + ret = append(ret, e) + } + } + return ret +} + +func (b *BrokerStub) GetAMMPoolEventsByMarket(id string) []*events.AMMPool { + evts := b.GetAMMPoolEvents() + ret := make([]*events.AMMPool, 0, 10) + for _, e := range evts { + if e.MarketID() == id { + ret = append(ret, e) + } + } + return ret +} + +func (b *BrokerStub) GetAMMPoolEventsByPartyAndMarket(party, mID string) []*events.AMMPool { + evts := b.GetAMMPoolEvents() + ret := make([]*events.AMMPool, 0, 5) + for _, e := range evts { + if e.IsParty(party) && e.MarketID() == mID { + ret = append(ret, e) + } + } + return ret +} + +func (b *BrokerStub) GetLastAMMPoolEvents() map[string]map[string]*events.AMMPool { + ret := map[string]map[string]*events.AMMPool{} + evts := b.GetAMMPoolEvents() + for _, e := range evts { + mID := e.MarketID() + mmap, ok := ret[mID] + if !ok { + mmap = map[string]*events.AMMPool{} + } + mmap[e.PartyID()] = e + ret[mID] = mmap + } + return ret +} + +func (b *BrokerStub) GetAMMPoolEventMap() map[string]map[string][]*events.AMMPool { + ret := map[string]map[string][]*events.AMMPool{} + evts := b.GetAMMPoolEvents() + for _, e := range evts { + mID := e.MarketID() + mmap, ok := ret[mID] + if !ok { + mmap = map[string][]*events.AMMPool{} + } + pID := e.PartyID() + ps, ok := mmap[pID] + if !ok { + ps = []*events.AMMPool{} + } + mmap[pID] = append(ps, e) + ret[mID] = mmap + } + return ret +} + func (b *BrokerStub) ResetType(t events.Type) { b.mu.Lock() b.data[t] = []events.Event{} diff --git a/core/limits/engine.go b/core/limits/engine.go index 6b946616de4..a44b917a0e0 100644 --- a/core/limits/engine.go +++ b/core/limits/engine.go @@ -36,8 +36,8 @@ type Engine struct { canProposeMarket, canProposeAsset bool // Settings from the genesis state - proposeMarketEnabled, proposeAssetEnabled, proposeSpotMarketEnabled, proposePerpsMarketEnabled bool - proposeMarketEnabledFrom, proposeAssetEnabledFrom time.Time + proposeMarketEnabled, proposeAssetEnabled, proposeSpotMarketEnabled, proposePerpsMarketEnabled, useAMMEnabled bool + proposeMarketEnabledFrom, proposeAssetEnabledFrom time.Time genesisLoaded bool @@ -145,6 +145,12 @@ func (e *Engine) OnLimitsProposePerpsMarketEnabledFromUpdate(ctx context.Context return nil } +func (e *Engine) OnLimitsProposeAMMEnabledUpdate(ctx context.Context, enabled int64) error { + e.useAMMEnabled = enabled == 1 + e.sendEvent(ctx) + return nil +} + func (e *Engine) OnLimitsProposeAssetEnabledFromUpdate(ctx context.Context, date string) error { // already validated by the netparams // no need to check it again, this is a valid date @@ -222,6 +228,10 @@ func (e *Engine) CanProposePerpsMarket() bool { return e.proposePerpsMarketEnabled } +func (e *Engine) CanUseAMMPool() bool { + return e.useAMMEnabled +} + func (e *Engine) sendEvent(ctx context.Context) { limits := vega.NetworkLimits{ CanProposeMarket: e.canProposeMarket, @@ -231,6 +241,7 @@ func (e *Engine) sendEvent(ctx context.Context) { GenesisLoaded: e.genesisLoaded, CanProposeSpotMarket: e.proposeSpotMarketEnabled, CanProposePerpetualMarket: e.proposePerpsMarketEnabled, + CanUseAmm: e.useAMMEnabled, } if !e.proposeMarketEnabledFrom.IsZero() { diff --git a/core/limits/snapshot.go b/core/limits/snapshot.go index 537fe1f8ae8..a2fac68f84e 100644 --- a/core/limits/snapshot.go +++ b/core/limits/snapshot.go @@ -48,6 +48,7 @@ func (e *Engine) serialiseLimits() ([]byte, error) { ProposeAssetEnabled: e.proposeAssetEnabled, ProposeMarketEnabledFrom: e.proposeMarketEnabledFrom, ProposeAssetEnabledFrom: e.proposeAssetEnabledFrom, + CanUseAMMEnabled: e.useAMMEnabled, }, }, } @@ -109,6 +110,7 @@ func (e *Engine) restoreLimits(ctx context.Context, l *types.LimitState, p *type e.proposeAssetEnabledFrom = l.ProposeAssetEnabledFrom e.proposeSpotMarketEnabled = l.ProposeSpotMarketEnabled e.proposePerpsMarketEnabled = l.ProposePerpsMarketEnabled + e.useAMMEnabled = l.CanUseAMMEnabled e.sendEvent(ctx) var err error diff --git a/core/liquidity/v2/scores.go b/core/liquidity/v2/scores.go index 305c44be7e3..125da45052b 100644 --- a/core/liquidity/v2/scores.go +++ b/core/liquidity/v2/scores.go @@ -79,6 +79,11 @@ func (e *Engine) GetCurrentLiquidityScores(bestBid, bestAsk num.Decimal, minLpPr return r, t } +// GetPartyLiquidityScore returns the volume-weighted probability of trading for the orders. Used to get a score for the AMM shape. +func (e *Engine) GetPartyLiquidityScore(orders []*types.Order, bestBid, bestAsk num.Decimal, minP, maxP *num.Uint) num.Decimal { + return e.suppliedEngine.CalculateLiquidityScore(orders, bestBid, bestAsk, minP, maxP) +} + func (e *Engine) getAllActiveOrders(party string) []*types.Order { partyOrders := e.orderBook.GetOrdersPerParty(party) orders := make([]*types.Order, 0, len(partyOrders)) diff --git a/core/liquidity/v2/types.go b/core/liquidity/v2/types.go index f4b95990be9..9fe40707e99 100644 --- a/core/liquidity/v2/types.go +++ b/core/liquidity/v2/types.go @@ -143,6 +143,14 @@ func (l ProvisionsPerParty) FeeForWeightedAverage() num.Decimal { return l.Slice().sortByCommitment().feeForWeightedAverage() } +func (l ProvisionsPerParty) Clone() ProvisionsPerParty { + clone := ProvisionsPerParty{} + for k, v := range l { + clone[k] = v + } + return clone +} + // TotalStake returns the sum of all CommitmentAmount, which corresponds to the // total stake of a market. func (l ProvisionsPerParty) TotalStake() *num.Uint { diff --git a/core/matching/cached_orderbook.go b/core/matching/cached_orderbook.go index d7ab4109d31..d75676bba50 100644 --- a/core/matching/cached_orderbook.go +++ b/core/matching/cached_orderbook.go @@ -39,6 +39,10 @@ func NewCachedOrderBook( } } +func (b *CachedOrderBook) SetOffbookSource(obs OffbookSource) { + b.OrderBook.SetOffbookSource(obs) +} + func (b *CachedOrderBook) LoadState(ctx context.Context, payload *types.Payload) ([]types.StateProvider, error) { providers, err := b.OrderBook.LoadState(ctx, payload) if err != nil { diff --git a/core/matching/helpers_test.go b/core/matching/helpers_test.go index 400340a1172..7f8f1b2b81c 100644 --- a/core/matching/helpers_test.go +++ b/core/matching/helpers_test.go @@ -39,7 +39,6 @@ func getTestOrderBook(_ *testing.T, market string) *tstOB { log: logging.NewTestLogger(), } tob.OrderBook = NewOrderBook(tob.log, NewDefaultConfig(), market, false, peggedOrderCounterForTest) - // Turn on all the debug levels so we can cover more lines of code tob.OrderBook.LogPriceLevelsDebug = true tob.OrderBook.LogRemovedOrdersDebug = true diff --git a/core/matching/mocks/mocks.go b/core/matching/mocks/mocks.go new file mode 100644 index 00000000000..62af1e0e234 --- /dev/null +++ b/core/matching/mocks/mocks.go @@ -0,0 +1,79 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: code.vegaprotocol.io/vega/core/matching (interfaces: OffbookSource) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + reflect "reflect" + + types "code.vegaprotocol.io/vega/core/types" + num "code.vegaprotocol.io/vega/libs/num" + gomock "github.com/golang/mock/gomock" +) + +// MockOffbookSource is a mock of OffbookSource interface. +type MockOffbookSource struct { + ctrl *gomock.Controller + recorder *MockOffbookSourceMockRecorder +} + +// MockOffbookSourceMockRecorder is the mock recorder for MockOffbookSource. +type MockOffbookSourceMockRecorder struct { + mock *MockOffbookSource +} + +// NewMockOffbookSource creates a new mock instance. +func NewMockOffbookSource(ctrl *gomock.Controller) *MockOffbookSource { + mock := &MockOffbookSource{ctrl: ctrl} + mock.recorder = &MockOffbookSourceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockOffbookSource) EXPECT() *MockOffbookSourceMockRecorder { + return m.recorder +} + +// BestPricesAndVolumes mocks base method. +func (m *MockOffbookSource) BestPricesAndVolumes() (*num.Uint, uint64, *num.Uint, uint64) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BestPricesAndVolumes") + ret0, _ := ret[0].(*num.Uint) + ret1, _ := ret[1].(uint64) + ret2, _ := ret[2].(*num.Uint) + ret3, _ := ret[3].(uint64) + return ret0, ret1, ret2, ret3 +} + +// BestPricesAndVolumes indicates an expected call of BestPricesAndVolumes. +func (mr *MockOffbookSourceMockRecorder) BestPricesAndVolumes() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BestPricesAndVolumes", reflect.TypeOf((*MockOffbookSource)(nil).BestPricesAndVolumes)) +} + +// NotifyFinished mocks base method. +func (m *MockOffbookSource) NotifyFinished() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "NotifyFinished") +} + +// NotifyFinished indicates an expected call of NotifyFinished. +func (mr *MockOffbookSourceMockRecorder) NotifyFinished() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NotifyFinished", reflect.TypeOf((*MockOffbookSource)(nil).NotifyFinished)) +} + +// SubmitOrder mocks base method. +func (m *MockOffbookSource) SubmitOrder(arg0 *types.Order, arg1, arg2 *num.Uint) []*types.Order { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SubmitOrder", arg0, arg1, arg2) + ret0, _ := ret[0].([]*types.Order) + return ret0 +} + +// SubmitOrder indicates an expected call of SubmitOrder. +func (mr *MockOffbookSourceMockRecorder) SubmitOrder(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubmitOrder", reflect.TypeOf((*MockOffbookSource)(nil).SubmitOrder), arg0, arg1, arg2) +} diff --git a/core/matching/orderbook.go b/core/matching/orderbook.go index ee3a1a72488..660e9f37ce4 100644 --- a/core/matching/orderbook.go +++ b/core/matching/orderbook.go @@ -42,6 +42,13 @@ var ( ErrNotCrossed = errors.New("not crossed") ) +//go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/core/matching OffbookSource +type OffbookSource interface { + BestPricesAndVolumes() (*num.Uint, uint64, *num.Uint, uint64) + SubmitOrder(agg *types.Order, inner, outer *num.Uint) []*types.Order + NotifyFinished() +} + // OrderBook represents the book holding all orders in the system. type OrderBook struct { log *logging.Logger @@ -129,6 +136,11 @@ func (b *OrderBook) ReloadConf(cfg Config) { b.cfgMu.Unlock() } +func (b *OrderBook) SetOffbookSource(obs OffbookSource) { + b.buy.offbook = obs + b.sell.offbook = obs +} + // GetOrderBookLevelCount returns the number of levels in the book. func (b *OrderBook) GetOrderBookLevelCount() uint64 { return uint64(len(b.buy.levels) + len(b.sell.levels)) @@ -567,7 +579,7 @@ func (b *OrderBook) uncrossBookSide( } // try to get the market price value from the order - trades, affectedOrders, _, err := opSide.uncross(order, false) + trades, affectedOrders, _, err := opSide.uncross(order, false, nil) if err != nil { return nil, err } @@ -609,12 +621,41 @@ func (b *OrderBook) GetOrdersPerParty(party string) []*types.Order { // BestBidPriceAndVolume : Return the best bid and volume for the buy side of the book. func (b *OrderBook) BestBidPriceAndVolume() (*num.Uint, uint64, error) { - return b.buy.BestPriceAndVolume() + price, volume, err := b.buy.BestPriceAndVolume() + + if b.buy.offbook != nil { + oPrice, oVolume, _, _ := b.buy.offbook.BestPricesAndVolumes() + + // no off source volume, return the orderbook + if oVolume == 0 { + return price, volume, err + } + + if err == nil && oPrice.EQ(price) { + oVolume += volume + } + return oPrice, oVolume, nil + } + return price, volume, err } // BestOfferPriceAndVolume : Return the best bid and volume for the sell side of the book. func (b *OrderBook) BestOfferPriceAndVolume() (*num.Uint, uint64, error) { - return b.sell.BestPriceAndVolume() + price, volume, err := b.sell.BestPriceAndVolume() + if b.sell.offbook != nil { + _, _, oPrice, oVolume := b.sell.offbook.BestPricesAndVolumes() + + // no off source volume, return the orderbook + if oVolume == 0 { + return price, volume, err + } + + if err == nil && oPrice.EQ(price) { + oVolume += volume + } + return oPrice, oVolume, nil + } + return price, volume, err } func (b *OrderBook) CancelAllOrders(party string) ([]*types.OrderCancellationConfirmation, error) { @@ -794,7 +835,8 @@ func (b *OrderBook) GetTrades(order *types.Order) ([]*types.Trade, error) { b.latestTimestamp = order.CreatedAt } - trades, err := b.getOppositeSide(order.Side).fakeUncross(order, true) + idealPrice := b.theoreticalBestTradePrice(order) + trades, err := b.getOppositeSide(order.Side).fakeUncross(order, true, idealPrice) // it's fine for the error to be a wash trade here, // it's just be stopped when really uncrossing. if err != nil && err != ErrWashTrade { @@ -843,6 +885,25 @@ func (b *OrderBook) ReSubmitSpecialOrders(order *types.Order) { b.add(order) } +// theoreticalBestTradePrice returns the best possible price the incoming order could trade +// as if the spread were as small as possible. This will be used to construct the first +// interval to query offbook orders matching with the other side. +func (b *OrderBook) theoreticalBestTradePrice(order *types.Order) *num.Uint { + bp, _, err := b.getSide(order.Side).BestPriceAndVolume() + if err != nil { + return nil + } + + switch order.Side { + case types.SideBuy: + return bp.Add(bp, num.UintOne()) + case types.SideSell: + return bp.Sub(bp, num.UintOne()) + default: + panic("unexpected order side") + } +} + // SubmitOrder Add an order and attempt to uncross the book, returns a TradeSet protobuf message object. func (b *OrderBook) SubmitOrder(order *types.Order) (*types.OrderConfirmation, error) { if err := b.validateOrder(order); err != nil { @@ -867,7 +928,8 @@ func (b *OrderBook) SubmitOrder(order *types.Order) (*types.OrderConfirmation, e if !b.auction { // uncross with opposite - trades, impactedOrders, lastTradedPrice, err = b.getOppositeSide(order.Side).uncross(order, true) + idealPrice := b.theoreticalBestTradePrice(order) + trades, impactedOrders, lastTradedPrice, err = b.getOppositeSide(order.Side).uncross(order, true, idealPrice) if !lastTradedPrice.IsZero() { b.lastTradedPrice = lastTradedPrice } @@ -1051,29 +1113,85 @@ func makeResponse(order *types.Order, trades []*types.Trade, impactedOrders []*t } func (b *OrderBook) GetBestBidPrice() (*num.Uint, error) { + // AMM price can never be crossed with the orderbook, so if there is a best price with volume use it + if b.buy.offbook != nil { + price, volume, _, _ := b.buy.offbook.BestPricesAndVolumes() + if volume != 0 { + return price, nil + } + } price, _, err := b.buy.BestPriceAndVolume() return price, err } func (b *OrderBook) GetBestStaticBidPrice() (*num.Uint, error) { + // AMM price can never be crossed with the orderbook, so if there is a best price with volume use it + if b.buy.offbook != nil { + price, volume, _, _ := b.buy.offbook.BestPricesAndVolumes() + if volume != 0 { + return price, nil + } + } return b.buy.BestStaticPrice() } func (b *OrderBook) GetBestStaticBidPriceAndVolume() (*num.Uint, uint64, error) { - return b.buy.BestStaticPriceAndVolume() + price, volume, err := b.buy.BestStaticPriceAndVolume() + if b.buy.offbook != nil { + oPrice, oVolume, _, _ := b.buy.offbook.BestPricesAndVolumes() + + // no off source volume, return the orderbook + if oVolume == 0 { + return price, volume, err + } + + if err == nil && oPrice.EQ(price) { + oVolume += volume + } + return oPrice, oVolume, nil + } + return price, volume, err } func (b *OrderBook) GetBestAskPrice() (*num.Uint, error) { + // AMM price can never be crossed with the orderbook, so if there is a best price with volume use it + if b.sell.offbook != nil { + _, _, price, volume := b.sell.offbook.BestPricesAndVolumes() + if volume != 0 { + return price, nil + } + } price, _, err := b.sell.BestPriceAndVolume() return price, err } func (b *OrderBook) GetBestStaticAskPrice() (*num.Uint, error) { + // AMM price can never be crossed with the orderbook, so if there is a best price with volume use it + if b.sell.offbook != nil { + _, _, price, volume := b.sell.offbook.BestPricesAndVolumes() + if volume != 0 { + return price, nil + } + } return b.sell.BestStaticPrice() } func (b *OrderBook) GetBestStaticAskPriceAndVolume() (*num.Uint, uint64, error) { - return b.sell.BestStaticPriceAndVolume() + price, volume, err := b.sell.BestStaticPriceAndVolume() + if b.sell.offbook != nil { + _, _, oPrice, oVolume := b.sell.offbook.BestPricesAndVolumes() + + // no off source volume, return the orderbook + if oVolume == 0 { + return price, volume, err + } + + if err == nil && oPrice.EQ(price) { + oVolume += volume + } + return oPrice, oVolume, nil + } + return price, volume, err } func (b *OrderBook) GetLastTradedPrice() *num.Uint { @@ -1191,6 +1309,10 @@ func (b *OrderBook) remove(o *types.Order) { // add adds the given order too all the lookup maps. func (b *OrderBook) add(o *types.Order) { + if o.GeneratedOffbook { + b.log.Panic("Can not add offbook order to the orderbook", logging.Order(o)) + } + b.ordersByID[o.ID] = o if orders, ok := b.ordersPerParty[o.Party]; !ok { b.ordersPerParty[o.Party] = map[string]struct{}{ diff --git a/core/matching/orderbook_amm_test.go b/core/matching/orderbook_amm_test.go new file mode 100644 index 00000000000..08cc9765366 --- /dev/null +++ b/core/matching/orderbook_amm_test.go @@ -0,0 +1,336 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package matching_test + +import ( + "testing" + + "code.vegaprotocol.io/vega/core/matching" + "code.vegaprotocol.io/vega/core/matching/mocks" + "code.vegaprotocol.io/vega/core/types" + vgcrypto "code.vegaprotocol.io/vega/libs/crypto" + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/logging" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestOrderbookAMM(t *testing.T) { + t.Run("test empty book and AMM", testEmptyBookAndAMM) + t.Run("test empty book and matching AMM", testEmptyBookMatchingAMM) + t.Run("test empty book and matching AMM with incoming FOK", testEmptyBookMatchingAMMFOK) + t.Run("test matching between price levels", testMatchBetweenPriceLevels) + t.Run("test matching with orders on both sides", testMatchOrdersBothSide) +} + +func testEmptyBookAndAMM(t *testing.T) { + tst := getTestOrderBookWithAMM(t) + defer tst.ctrl.Finish() + price := num.NewUint(100) + + // fake uncross + o := createOrder(t, tst, 100, price) + tst.obs.EXPECT().SubmitOrder(gomock.Any(), nil, price).Times(1) + tst.obs.EXPECT().NotifyFinished().Times(1) + trades, err := tst.book.GetTrades(o) + assert.NoError(t, err) + assert.Len(t, trades, 0) + + // uncross + tst.obs.EXPECT().SubmitOrder(gomock.Any(), nil, price).Times(1) + tst.obs.EXPECT().NotifyFinished().Times(1) + conf, err := tst.book.SubmitOrder(o) + assert.NoError(t, err) + assert.Len(t, conf.PassiveOrdersAffected, 0) + assert.Len(t, conf.Trades, 0) +} + +func testEmptyBookMatchingAMM(t *testing.T) { + tst := getTestOrderBookWithAMM(t) + defer tst.ctrl.Finish() + price := num.NewUint(100) + + o := createOrder(t, tst, 1000, price) + generated := createGeneratedOrders(t, tst, price) + + // fake uncross + tst.obs.EXPECT().SubmitOrder(gomock.Any(), nil, price).Times(1).Return(generated) + tst.obs.EXPECT().NotifyFinished().Times(1) + trades, err := tst.book.GetTrades(o) + assert.NoError(t, err) + assert.Len(t, trades, 2) + + // uncross + tst.obs.EXPECT().SubmitOrder(gomock.Any(), nil, price).Times(1).Return(generated) + tst.obs.EXPECT().NotifyFinished().Times(1) + conf, err := tst.book.SubmitOrder(o) + assert.NoError(t, err) + assertConf(t, conf, 2, 10) +} + +func testEmptyBookMatchingAMMFOK(t *testing.T) { + tst := getTestOrderBookWithAMM(t) + defer tst.ctrl.Finish() + price := num.NewUint(100) + + o := createOrder(t, tst, 20, price) + generated := createGeneratedOrders(t, tst, price) + + o.TimeInForce = types.OrderTimeInForceFOK + + // fake uncross + tst.obs.EXPECT().SubmitOrder(gomock.Any(), nil, price).Times(2).Return(generated) + tst.obs.EXPECT().NotifyFinished().Times(2) + trades, err := tst.book.GetTrades(o) + assert.NoError(t, err) + assert.Len(t, trades, 2) + + // uncross + tst.obs.EXPECT().SubmitOrder(gomock.Any(), nil, price).Times(2).Return(generated) + tst.obs.EXPECT().NotifyFinished().Times(2) + conf, err := tst.book.SubmitOrder(o) + assert.NoError(t, err) + assertConf(t, conf, 2, 10) +} + +func testMatchBetweenPriceLevels(t *testing.T) { + tst := getTestOrderBookWithAMM(t) + defer tst.ctrl.Finish() + + createPriceLevels(t, tst, 10, + num.NewUint(100), + num.NewUint(110), + num.NewUint(120), + ) + + price := num.NewUint(90) + size := uint64(1000) + + o := createOrder(t, tst, size, price) + generated := createGeneratedOrders(t, tst, price) + + // price levels at 100, 110, 120, incoming order at 100 + // expect it to consume all volume at the three levels, and between each level we'll submit to offbook + tst.obs.EXPECT().SubmitOrder(gomock.Any(), gomock.Any(), gomock.Any()).Times(4).Return(generated) + tst.obs.EXPECT().NotifyFinished().Times(1) + trades, err := tst.book.GetTrades(o) + assert.NoError(t, err) + + // 3 trades with each price level, and then 2 trades from AMM in the intervals + // (nil, 120) (120, 110) (110, 100) (100, 90) + // so 3 + (2 * 4) = 11 + assert.Len(t, trades, 11) + + // uncross + expectOffbookOrders(t, tst, price, nil, num.NewUint(120)) + expectOffbookOrders(t, tst, price, num.NewUint(120), num.NewUint(110)) + expectOffbookOrders(t, tst, price, num.NewUint(110), num.NewUint(100)) + expectOffbookOrders(t, tst, price, num.NewUint(100), num.NewUint(90)) + tst.obs.EXPECT().NotifyFinished().Times(1) + + conf, err := tst.book.SubmitOrder(o) + assert.NoError(t, err) + assertConf(t, conf, 11, 10) +} + +func testMatchOrdersBothSide(t *testing.T) { + tst := getTestOrderBookWithAMM(t) + defer tst.ctrl.Finish() + + createPriceLevels(t, tst, 10, + num.NewUint(120), + num.NewUint(110), + ) + + // this one will be on the opposite side of the book as price levels + // sell order willing to sell at 130 + oPrice := uint64(130) + tst.obs.EXPECT().SubmitOrder(gomock.Any(), gomock.Any(), gomock.Any()).Times(1) + tst.obs.EXPECT().NotifyFinished().Times(1) + o := createOrder(t, tst, 10, num.NewUint(oPrice)) + + conf, err := tst.book.SubmitOrder(o) + assert.NoError(t, err) + assertConf(t, conf, 0, 0) + + price := num.NewUint(90) + size := uint64(1000) + o = createOrder(t, tst, size, price) + generated := createGeneratedOrders(t, tst, price) + + // price levels at 100, 110, 120, incoming order at 100 + // expect it to consume all volume at the three levels, and between each level we'll submit to offbook + tst.obs.EXPECT().SubmitOrder(gomock.Any(), gomock.Any(), gomock.Any()).Times(3).Return(generated) + tst.obs.EXPECT().NotifyFinished().Times(1) + trades, err := tst.book.GetTrades(o) + assert.NoError(t, err) + + // 3 trades with each price level, and then 2 trades from AMM in the intervals + // (nil, 120) (120, 110) (110, 100) (100, 90) + // so 3 + (2 * 4) = 11 + assert.Len(t, trades, 8) + + // uncross + expectOffbookOrders(t, tst, price, num.NewUint(oPrice-1), num.NewUint(120)) + expectOffbookOrders(t, tst, price, num.NewUint(120), num.NewUint(110)) + expectOffbookOrders(t, tst, price, num.NewUint(110), num.NewUint(90)) + tst.obs.EXPECT().NotifyFinished().Times(1) + + conf, err = tst.book.SubmitOrder(o) + assert.NoError(t, err) + assertConf(t, conf, 8, 10) +} + +func TestAMMOnlyBestPrices(t *testing.T) { + tst := getTestOrderBookWithAMM(t) + defer tst.ctrl.Finish() + + tst.obs.EXPECT().BestPricesAndVolumes().Return( + num.NewUint(1999), + uint64(10), + num.NewUint(2001), + uint64(9), + ).AnyTimes() + + // Best + price, err := tst.book.GetBestAskPrice() + require.NoError(t, err) + assert.Equal(t, "2001", price.String()) + + price, err = tst.book.GetBestBidPrice() + require.NoError(t, err) + assert.Equal(t, "1999", price.String()) + + // Best and volume + price, volume, err := tst.book.BestOfferPriceAndVolume() + require.NoError(t, err) + assert.Equal(t, "2001", price.String()) + assert.Equal(t, uint64(9), volume) + + price, volume, err = tst.book.BestBidPriceAndVolume() + require.NoError(t, err) + assert.Equal(t, "1999", price.String()) + assert.Equal(t, uint64(10), volume) + + // Best static + price, err = tst.book.GetBestStaticAskPrice() + require.NoError(t, err) + assert.Equal(t, "2001", price.String()) + + price, err = tst.book.GetBestStaticBidPrice() + require.NoError(t, err) + assert.Equal(t, "1999", price.String()) + + // Best static and volume + price, volume, err = tst.book.GetBestStaticAskPriceAndVolume() + require.NoError(t, err) + assert.Equal(t, "2001", price.String()) + assert.Equal(t, uint64(9), volume) + + price, volume, err = tst.book.GetBestStaticBidPriceAndVolume() + require.NoError(t, err) + assert.Equal(t, "1999", price.String()) + assert.Equal(t, uint64(10), volume) +} + +func assertConf(t *testing.T, conf *types.OrderConfirmation, n int, size uint64) { + t.Helper() + assert.Len(t, conf.PassiveOrdersAffected, n) + assert.Len(t, conf.Trades, n) + for i := range conf.Trades { + assert.Equal(t, conf.Trades[i].Size, size) + assert.Equal(t, conf.PassiveOrdersAffected[i].Remaining, uint64(0)) + } +} + +func expectOffbookOrders(t *testing.T, tst *tstOrderbook, price, first, last *num.Uint) { + t.Helper() + generated := createGeneratedOrders(t, tst, price) + tst.obs.EXPECT().SubmitOrder(gomock.Any(), first, last).Times(1).Return(generated) +} + +type tstOrderbook struct { + ctrl *gomock.Controller + book *matching.CachedOrderBook + obs *mocks.MockOffbookSource + marketID string +} + +func createOrder(t *testing.T, tst *tstOrderbook, size uint64, price *num.Uint) *types.Order { + t.Helper() + return &types.Order{ + ID: vgcrypto.RandomHash(), + Status: types.OrderStatusActive, + MarketID: tst.marketID, + Party: "A", + Side: types.SideSell, + Price: price, + OriginalPrice: price, + Size: size, + Remaining: size, + TimeInForce: types.OrderTimeInForceGTC, + Type: types.OrderTypeLimit, + } +} + +func createGeneratedOrders(t *testing.T, tst *tstOrderbook, price *num.Uint) []*types.Order { + t.Helper() + + orders := []*types.Order{} + for i := 0; i < 2; i++ { + o := createOrder(t, tst, 10, price) + o.Side = types.OtherSide(o.Side) + o.Party = "C" + orders = append(orders, o) + } + + return orders +} + +func createPriceLevels(t *testing.T, tst *tstOrderbook, size uint64, levels ...*num.Uint) { + t.Helper() + + tst.obs.EXPECT().SubmitOrder(gomock.Any(), gomock.Any(), gomock.Any()).Times(len(levels)) + tst.obs.EXPECT().NotifyFinished().Times(len(levels)) + for _, l := range levels { + o := createOrder(t, tst, size, l) + o.Side = types.OtherSide(o.Side) + o.Party = "B" + conf, err := tst.book.SubmitOrder(o) + require.NoError(t, err) + require.Len(t, conf.Trades, 0) + } +} + +func getTestOrderBookWithAMM(t *testing.T) *tstOrderbook { + t.Helper() + + ctrl := gomock.NewController(t) + obs := mocks.NewMockOffbookSource(ctrl) + + marketID := "testMarket" + book := matching.NewCachedOrderBook(logging.NewTestLogger(), matching.NewDefaultConfig(), "testMarket", false, peggedOrderCounterForTest) + book.SetOffbookSource(obs) + + return &tstOrderbook{ + ctrl: ctrl, + book: book, + obs: obs, + marketID: marketID, + } +} diff --git a/core/matching/orderbook_test.go b/core/matching/orderbook_test.go index 37d202f2b13..7d805579452 100644 --- a/core/matching/orderbook_test.go +++ b/core/matching/orderbook_test.go @@ -63,7 +63,6 @@ func getTestOrderBook(t *testing.T, market string) *tstOB { log: logging.NewTestLogger(), } tob.ob = matching.NewCachedOrderBook(tob.log, matching.NewDefaultConfig(), market, false, peggedOrderCounterForTest) - tob.ob.LogRemovedOrdersDebug = true return &tob } diff --git a/core/matching/side.go b/core/matching/side.go index a76374c4fd1..885822412ae 100644 --- a/core/matching/side.go +++ b/core/matching/side.go @@ -33,9 +33,10 @@ var ErrPriceNotFound = errors.New("price-volume pair not found") // OrderBookSide represent a side of the book, either Sell or Buy. type OrderBookSide struct { - side types.Side - log *logging.Logger - levels []*PriceLevel + side types.Side + log *logging.Logger + levels []*PriceLevel + offbook OffbookSource } func (s *OrderBookSide) Hash() []byte { @@ -400,9 +401,15 @@ func (s *OrderBookSide) GetVolume(price *num.Uint) (uint64, error) { // fakeUncross returns hypothetical trades if the order book side were to be uncrossed with the agg order supplied, // checkWashTrades checks non-FOK orders for wash trades if set to true (FOK orders are always checked for wash trades). -func (s *OrderBookSide) fakeUncross(agg *types.Order, checkWashTrades bool) ([]*types.Trade, error) { +func (s *OrderBookSide) fakeUncross(agg *types.Order, checkWashTrades bool, idealPrice *num.Uint) ([]*types.Trade, error) { + defer s.uncrossFinished() + + // get a copy of the order passed in, so we can rely on fakeUncross to do its job + fake := agg.Clone() + var ( trades []*types.Trade + offbookOrders []*types.Order totalVolumeToFill uint64 ) if agg.TimeInForce == types.OrderTimeInForceFOK { @@ -413,6 +420,12 @@ func (s *OrderBookSide) fakeUncross(agg *types.Order, checkWashTrades bool) ([]* checkPrice = func(levelPrice *num.Uint) bool { return levelPrice.GTE(agg.Price) } } + // first check for volume between the theoretical best price and the first price level + _, oo := s.uncrossOffbook(len(s.levels), fake, idealPrice, true) + for _, order := range oo { + totalVolumeToFill += order.Remaining + } + for i := len(s.levels) - 1; i >= 0; i-- { level := s.levels[i] // we don't have to account for network orders, they don't apply in price monitoring @@ -427,7 +440,13 @@ func (s *OrderBookSide) fakeUncross(agg *types.Order, checkWashTrades bool) ([]* break } } + + _, oo := s.uncrossOffbook(i, fake, idealPrice, true) + for _, order := range oo { + totalVolumeToFill += order.Remaining + } } + if totalVolumeToFill >= agg.Remaining { break } @@ -437,11 +456,13 @@ func (s *OrderBookSide) fakeUncross(agg *types.Order, checkWashTrades bool) ([]* if totalVolumeToFill < agg.Remaining { return nil, nil } + + // reset the offbook source so we can then do it all again.... + s.uncrossFinished() } // get a copy of the order passed in, so we can rely on fakeUncross to do its job - fake := agg.Clone() - + fake = agg.Clone() var ( idx = len(s.levels) - 1 ntrades []*types.Trade @@ -455,6 +476,8 @@ func (s *OrderBookSide) fakeUncross(agg *types.Order, checkWashTrades bool) ([]* checkPrice = func(levelPrice *num.Uint) bool { return levelPrice.LT(agg.Price) } } + trades, offbookOrders = s.uncrossOffbook(idx+1, fake, idealPrice, true) + // in here we iterate from the end, as it's easier to remove the // price levels from the back of the slice instead of from the front // also it will allow us to reduce allocations @@ -470,6 +493,12 @@ func (s *OrderBookSide) fakeUncross(agg *types.Order, checkWashTrades bool) ([]* break } + if fake.Remaining != 0 { + obTrades, obOrders := s.uncrossOffbook(idx, fake, idealPrice, true) + trades = append(trades, obTrades...) + offbookOrders = append(offbookOrders, obOrders...) + } + // the orders are still part of the levels, so we just have to move on anyway idx-- } @@ -548,9 +577,62 @@ func clonePriceLevel(lvl *PriceLevel) *PriceLevel { } } +// betweenLevels returns the inner, outer bounds for the given idx in the price levels. +// Usually this means (inner, outer) = (lvl[i].price, lvl[i-1].price) but we also handle +// the past the first and last price levels. +func (s *OrderBookSide) betweenLevels(idx int, first, last *num.Uint) (*num.Uint, *num.Uint) { + // there are no price levels, so between is from low to high + if len(s.levels) == 0 { + return first, last + } + + // we're at the first price level + if idx == len(s.levels) { + return first, s.levels[idx-1].price + } + + // we're at the last price level + if idx == 0 { + return s.levels[0].price, last + } + return s.levels[idx].price, s.levels[idx-1].price +} + +func (s *OrderBookSide) uncrossFinished() { + if s.offbook != nil { + s.offbook.NotifyFinished() + } +} + +func (s *OrderBookSide) uncrossOffbook(idx int, agg *types.Order, idealPrice *num.Uint, fake bool) ([]*types.Trade, []*types.Order) { + if s.offbook == nil { + return nil, nil + } + + // get the bounds between price levels for the given price level index + inner, outer := s.betweenLevels(idx, idealPrice, agg.Price) + + // submit the order to the offbook source for volume between those bounds + orders := s.offbook.SubmitOrder(agg, inner, outer) + + trades := make([]*types.Trade, 0, len(orders)) + for _, o := range orders { + size := min(agg.Remaining, o.Remaining) + trade := newTrade(agg, o, size) + agg.Remaining -= size + if !fake { + o.Remaining -= size + } + trades = append(trades, trade) + } + + return trades, orders +} + // uncross returns trades after order book side gets uncrossed with the agg order supplied, // checkWashTrades checks non-FOK orders for wash trades if set to true (FOK orders are always checked for wash trades). -func (s *OrderBookSide) uncross(agg *types.Order, checkWashTrades bool) ([]*types.Trade, []*types.Order, *num.Uint, error) { +func (s *OrderBookSide) uncross(agg *types.Order, checkWashTrades bool, theoreticalBestTrade *num.Uint) ([]*types.Trade, []*types.Order, *num.Uint, error) { + defer s.uncrossFinished() var ( trades []*types.Trade impactedOrders []*types.Order @@ -559,6 +641,8 @@ func (s *OrderBookSide) uncross(agg *types.Order, checkWashTrades bool) ([]*type checkPrice func(*num.Uint) bool ) + fake := agg.Clone() + if agg.Side == types.SideSell { checkPrice = func(levelPrice *num.Uint) bool { return levelPrice.GTE(agg.Price) } } else { @@ -566,6 +650,11 @@ func (s *OrderBookSide) uncross(agg *types.Order, checkWashTrades bool) ([]*type } if agg.TimeInForce == types.OrderTimeInForceFOK { + _, oo := s.uncrossOffbook(len(s.levels), fake, theoreticalBestTrade, true) + for _, order := range oo { + totalVolumeToFill += order.Remaining + } + // Process these backwards for i := len(s.levels) - 1; i >= 0; i-- { level := s.levels[i] @@ -581,6 +670,11 @@ func (s *OrderBookSide) uncross(agg *types.Order, checkWashTrades bool) ([]*type // in case of network trades, we want to calculate an accurate average price to return totalVolumeToFill += order.Remaining + _, oo := s.uncrossOffbook(i, fake, theoreticalBestTrade, true) + for _, order := range oo { + totalVolumeToFill += order.Remaining + } + if totalVolumeToFill >= agg.Remaining { break } @@ -598,6 +692,9 @@ func (s *OrderBookSide) uncross(agg *types.Order, checkWashTrades bool) ([]*type if totalVolumeToFill < agg.Remaining { return trades, impactedOrders, lastTradedPrice, nil } + + // reset the offsource book so we can then do it all again.... + s.uncrossFinished() } var ( @@ -608,6 +705,10 @@ func (s *OrderBookSide) uncross(agg *types.Order, checkWashTrades bool) ([]*type err error ) + // first check for off source volume between the best theoretical price and the first price level + trades, impactedOrders = s.uncrossOffbook(idx+1, agg, theoreticalBestTrade, false) + filled = agg.Remaining == 0 + // in here we iterate from the end, as it's easier to remove the // price levels from the back of the slice instead of from the front // also it will allow us to reduce allocations @@ -620,6 +721,15 @@ func (s *OrderBookSide) uncross(agg *types.Order, checkWashTrades bool) ([]*type if err != nil && err == ErrWashTrade { break } + + if !filled { + // now check for off source volume between the price levels + ot, oo := s.uncrossOffbook(idx, agg, theoreticalBestTrade, false) + trades = append(trades, ot...) + impactedOrders = append(impactedOrders, oo...) + filled = agg.Remaining == 0 + } + if len(s.levels[idx].orders) <= 0 { idx-- } diff --git a/core/matching/side_test.go b/core/matching/side_test.go index 79bac86c43a..0ad22cecf72 100644 --- a/core/matching/side_test.go +++ b/core/matching/side_test.go @@ -178,7 +178,7 @@ func TestMemoryAllocationPriceLevelUncrossSide(t *testing.T) { Remaining: 1, TimeInForce: types.OrderTimeInForceGTC, } - side.uncross(aggressiveOrder, true) + side.uncross(aggressiveOrder, true, nil) assert.Len(t, side.levels, 1) } @@ -439,11 +439,11 @@ func TestFakeUncrossNormal(t *testing.T) { } checkWashTrades := false - fakeTrades, err := buySide.fakeUncross(&order, checkWashTrades) + fakeTrades, err := buySide.fakeUncross(&order, checkWashTrades, nil) assert.Len(t, fakeTrades, 5) assert.NoError(t, err) - trades, _, _, err := buySide.uncross(&order, checkWashTrades) + trades, _, _, err := buySide.uncross(&order, checkWashTrades, nil) assert.Len(t, trades, 5) assert.NoError(t, err) @@ -468,11 +468,11 @@ func TestFakeUncrossSelfTradeFOKMarketOrder(t *testing.T) { } checkWashTrades := false - fakeTrades, err1 := buySide.fakeUncross(&order, checkWashTrades) + fakeTrades, err1 := buySide.fakeUncross(&order, checkWashTrades, nil) assert.Len(t, fakeTrades, 0) assert.Error(t, err1) - trades, _, _, err2 := buySide.uncross(&order, checkWashTrades) + trades, _, _, err2 := buySide.uncross(&order, checkWashTrades, nil) assert.Len(t, trades, 0) assert.Error(t, err2) @@ -495,12 +495,12 @@ func TestFakeUncrossSelfTradeNonFOKLimitOrder_DontCheckWashTrades(t *testing.T) } checkWashTrades := false - fakeTrades, err := buySide.fakeUncross(&order, checkWashTrades) + fakeTrades, err := buySide.fakeUncross(&order, checkWashTrades, nil) assert.Len(t, fakeTrades, 1) assert.NoError(t, err) assert.Equal(t, fakeTrades[0].SellOrder, order.ID) - trades, _, _, err := buySide.uncross(&order, checkWashTrades) + trades, _, _, err := buySide.uncross(&order, checkWashTrades, nil) assert.Len(t, trades, 1) assert.NoError(t, err) @@ -523,12 +523,12 @@ func TestFakeUncrossSelfTradeNonFOKLimitOrder_CheckWashTrades(t *testing.T) { } checkWashTrades := true - fakeTrades, err1 := buySide.fakeUncross(&order, checkWashTrades) + fakeTrades, err1 := buySide.fakeUncross(&order, checkWashTrades, nil) assert.Len(t, fakeTrades, 0) assert.Error(t, err1) assert.Equal(t, "party attempted to submit wash trade", err1.Error()) - trades, _, _, err2 := buySide.uncross(&order, checkWashTrades) + trades, _, _, err2 := buySide.uncross(&order, checkWashTrades, nil) assert.Len(t, trades, 0) assert.Error(t, err2) assert.Equal(t, "party attempted to submit wash trade", err2.Error()) @@ -550,11 +550,11 @@ func TestFakeUncrossNotEnoughVolume(t *testing.T) { } checkWashTrades := false - fakeTrades, err := buySide.fakeUncross(&order, checkWashTrades) + fakeTrades, err := buySide.fakeUncross(&order, checkWashTrades, nil) assert.Len(t, fakeTrades, 0) assert.NoError(t, err) - trades, _, _, err := buySide.uncross(&order, checkWashTrades) + trades, _, _, err := buySide.uncross(&order, checkWashTrades, nil) assert.Len(t, trades, 0) assert.NoError(t, err) } @@ -594,7 +594,7 @@ func TestFakeUncrossAuction(t *testing.T) { trades := []*types.Trade{} for _, order := range orders { - trds, _, _, err := buySide.uncross(order, false) + trds, _, _, err := buySide.uncross(order, false, nil) assert.NoError(t, err) trades = append(trades, trds...) } diff --git a/core/netparams/defaults.go b/core/netparams/defaults.go index 700d2a35be4..875eb0497dc 100644 --- a/core/netparams/defaults.go +++ b/core/netparams/defaults.go @@ -73,9 +73,14 @@ func defaultNetParams() map[string]value { // perps PerpsMarketTradingEnabled: NewInt(gteI0, lteI1).Mutable(true).MustUpdate("0"), + // AMMs + AMMMarketTradingEnabled: NewInt(gteI0, lteI1).Mutable(true).MustUpdate("0"), + // ethereum oracles EthereumOraclesEnabled: NewInt(gteI0, lteI1).Mutable(true).MustUpdate("0"), + MarketAMMMinCommitmentQuantum: NewUint(UintGT(num.UintZero())).Mutable(true).MustUpdate("100"), + // markets MarketMarginScalingFactors: NewJSON(&proto.ScalingFactors{}, checks.MarginScalingFactor(), checks.MarginScalingFactorRange(num.DecimalOne(), num.DecimalFromInt64(100))).Mutable(true).MustUpdate(`{"search_level": 1.1, "initial_margin": 1.2, "collateral_release": 1.4}`), MarketFeeFactorsMakerFee: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.00025"), @@ -100,6 +105,7 @@ func defaultNetParams() map[string]value { MarketLiquiditySLANonPerformanceBondPenaltySlope: NewDecimal(gteD0, lteD1000).Mutable(true).MustUpdate("1"), MarketLiquidityStakeToCCYVolume: NewDecimal(gteD0, lteD100).Mutable(true).MustUpdate("1"), MarketLiquidityProvidersFeeCalculationTimeStep: NewDuration(gte1s, lte255h).Mutable(true).MustUpdate("1m"), + MarketLiquidityEquityLikeShareFeeFraction: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.5"), // governance market proposal GovernanceProposalMarketMinClose: NewDuration(gte1s, lte1y).Mutable(true).MustUpdate("48h0m0s"), diff --git a/core/netparams/keys.go b/core/netparams/keys.go index 46a3ccbcc53..05b5783abd9 100644 --- a/core/netparams/keys.go +++ b/core/netparams/keys.go @@ -18,6 +18,7 @@ package netparams const ( SpotMarketTradingEnabled = "limits.markets.proposeSpotEnabled" PerpsMarketTradingEnabled = "limits.markets.proposePerpetualEnabled" + AMMMarketTradingEnabled = "limits.markets.ammPoolEnabled" EthereumOraclesEnabled = "ethereum.oracles.enabled" MarketMarginScalingFactors = "market.margin.scalingFactors" @@ -46,6 +47,7 @@ const ( MarketLiquiditySLANonPerformanceBondPenaltySlope = "market.liquidity.sla.nonPerformanceBondPenaltySlope" MarketLiquidityStakeToCCYVolume = "market.liquidity.stakeToCcyVolume" MarketLiquidityProvidersFeeCalculationTimeStep = "market.liquidity.providersFeeCalculationTimeStep" + MarketLiquidityEquityLikeShareFeeFraction = "market.liquidity.equityLikeShareFeeFraction" RewardAsset = "reward.asset" @@ -259,6 +261,8 @@ const ( RewardsActivityStreakInactivityLimit = "rewards.activityStreak.inactivityLimit" RewardsActivityStreakMinQuantumOpenVolume = "rewards.activityStreak.minQuantumOpenVolume" RewardsActivityStreakMinQuantumTradeVolume = "rewards.activityStreak.minQuantumTradeVolume" + + MarketAMMMinCommitmentQuantum = "market.amm.minCommitmentQuantum" ) var Deprecated = map[string]struct{}{ @@ -273,6 +277,7 @@ var Deprecated = map[string]struct{}{ var AllKeys = map[string]struct{}{ SpamProtectionMaxUpdatePartyProfile: {}, SpamProtectionUpdateProfileMinFunds: {}, + MarketAMMMinCommitmentQuantum: {}, GovernanceProposalVolumeDiscountProgramMinClose: {}, GovernanceProposalVolumeDiscountProgramMaxClose: {}, GovernanceProposalVolumeDiscountProgramMinEnact: {}, @@ -292,6 +297,7 @@ var AllKeys = map[string]struct{}{ RewardsVestingBaseRate: {}, SpotMarketTradingEnabled: {}, PerpsMarketTradingEnabled: {}, + AMMMarketTradingEnabled: {}, EthereumOraclesEnabled: {}, MaxPeggedOrders: {}, MaxGasPerBlock: {}, @@ -311,6 +317,7 @@ var AllKeys = map[string]struct{}{ MarketLiquiditySLANonPerformanceBondPenaltyMax: {}, MarketLiquidityStakeToCCYVolume: {}, MarketLiquidityProvidersFeeCalculationTimeStep: {}, + MarketLiquidityEquityLikeShareFeeFraction: {}, MarketTargetStakeTimeWindow: {}, MarketTargetStakeScalingFactor: {}, MarketPriceMonitoringDefaultParameters: {}, diff --git a/core/positions/engine.go b/core/positions/engine.go index a9c668c3019..3ccc017d724 100644 --- a/core/positions/engine.go +++ b/core/positions/engine.go @@ -315,7 +315,6 @@ func (e *Engine) Update(ctx context.Context, trade *types.Trade, passiveOrder, a // Update long/short actual position for buyer and seller. // The buyer's position increases and the seller's position decreases. - buyer.averageEntryPrice = CalcVWAP(buyer.averageEntryPrice, buyer.size, int64(trade.Size), trade.Price) buyer.size += int64(trade.Size) seller.averageEntryPrice = CalcVWAP(seller.averageEntryPrice, -seller.size, int64(trade.Size), trade.Price) diff --git a/core/processor/abci.go b/core/processor/abci.go index a18547adf75..96515a900c4 100644 --- a/core/processor/abci.go +++ b/core/processor/abci.go @@ -87,6 +87,7 @@ var ( ErrOracleNoSubscribers = errors.New("there are no subscribes to the oracle data") ErrSpotMarketProposalDisabled = errors.New("spot market proposal disabled") ErrPerpsMarketProposalDisabled = errors.New("perps market proposal disabled") + ErrAMMPoolDisabled = errors.New("amm pool disabled") ErrOracleDataNormalization = func(err error) error { return fmt.Errorf("error normalizing incoming oracle data: %w", err) } @@ -451,6 +452,21 @@ func NewApp(log *logging.Logger, addDeterministicID(app.DeliverAmendOrder), ), ). + HandleDeliverTx(txn.SubmitAMMCommand, + app.SendTransactionResult( + addDeterministicID(app.DeliverSubmitAMM), + ), + ). + HandleDeliverTx(txn.AmendAMMCommand, + app.SendTransactionResult( + addDeterministicID(app.DeliverAmendAMM), + ), + ). + HandleDeliverTx(txn.CancelAMMCommand, + app.SendTransactionResult( + addDeterministicID(app.DeliverCancelAMM), + ), + ). HandleDeliverTx(txn.WithdrawCommand, app.SendTransactionResult( addDeterministicID(app.DeliverWithdraw))). @@ -1366,6 +1382,10 @@ func (app *App) canSubmitTx(tx abci.Tx) (err error) { if !app.limits.CanTrade() { return ErrTradingDisabled } + case txn.SubmitAMMCommand, txn.AmendAMMCommand, txn.CancelAMMCommand: + if !app.limits.CanUseAMMPool() { + return ErrAMMPoolDisabled + } case txn.ProposeCommand: praw := &commandspb.ProposalSubmission{} if err := tx.Unmarshal(praw); err != nil { @@ -2627,6 +2647,36 @@ func (app *App) UpdateMarginMode(ctx context.Context, tx abci.Tx) error { return app.exec.UpdateMarginMode(ctx, tx.Party(), params.MarketId, types.MarginMode(params.Mode), marginFactor) } +func (app *App) DeliverSubmitAMM(ctx context.Context, tx abci.Tx, deterministicID string) error { + params := &commandspb.SubmitAMM{} + if err := tx.Unmarshal(params); err != nil { + return fmt.Errorf("could not deserialize SubmitAMM command: %w", err) + } + + submit := types.NewSubmitAMMFromProto(params, tx.Party()) + return app.exec.SubmitAMM(ctx, submit, deterministicID) +} + +func (app *App) DeliverAmendAMM(ctx context.Context, tx abci.Tx, deterministicID string) error { + params := &commandspb.AmendAMM{} + if err := tx.Unmarshal(params); err != nil { + return fmt.Errorf("could not deserialize AmendAMM command: %w", err) + } + + amend := types.NewAmendAMMFromProto(params, tx.Party()) + return app.exec.AmendAMM(ctx, amend, deterministicID) +} + +func (app *App) DeliverCancelAMM(ctx context.Context, tx abci.Tx, deterministicID string) error { + params := &commandspb.CancelAMM{} + if err := tx.Unmarshal(params); err != nil { + return fmt.Errorf("could not deserialize CancelAMM command: %w", err) + } + + cancel := types.NewCancelAMMFromProto(params, tx.Party()) + return app.exec.CancelAMM(ctx, cancel, deterministicID) +} + // UpdateReferralSet this is effectively Update team, but also served to create // a team for an existing referral set... func (app *App) UpdateReferralSet(ctx context.Context, tx abci.Tx) error { diff --git a/core/processor/mocks/mocks.go b/core/processor/mocks/mocks.go index 8a4428eb4ec..070bc9776fe 100644 --- a/core/processor/mocks/mocks.go +++ b/core/processor/mocks/mocks.go @@ -266,6 +266,20 @@ func (m *MockExecutionEngine) EXPECT() *MockExecutionEngineMockRecorder { return m.recorder } +// AmendAMM mocks base method. +func (m *MockExecutionEngine) AmendAMM(arg0 context.Context, arg1 *types.AmendAMM, arg2 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AmendAMM", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// AmendAMM indicates an expected call of AmendAMM. +func (mr *MockExecutionEngineMockRecorder) AmendAMM(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AmendAMM", reflect.TypeOf((*MockExecutionEngine)(nil).AmendAMM), arg0, arg1, arg2) +} + // AmendLiquidityProvision mocks base method. func (m *MockExecutionEngine) AmendLiquidityProvision(arg0 context.Context, arg1 *types.LiquidityProvisionAmendment, arg2, arg3 string) error { m.ctrl.T.Helper() @@ -319,6 +333,20 @@ func (mr *MockExecutionEngineMockRecorder) BlockEnd(arg0 interface{}) *gomock.Ca return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BlockEnd", reflect.TypeOf((*MockExecutionEngine)(nil).BlockEnd), arg0) } +// CancelAMM mocks base method. +func (m *MockExecutionEngine) CancelAMM(arg0 context.Context, arg1 *types.CancelAMM, arg2 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CancelAMM", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// CancelAMM indicates an expected call of CancelAMM. +func (mr *MockExecutionEngineMockRecorder) CancelAMM(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CancelAMM", reflect.TypeOf((*MockExecutionEngine)(nil).CancelAMM), arg0, arg1, arg2) +} + // CancelLiquidityProvision mocks base method. func (m *MockExecutionEngine) CancelLiquidityProvision(arg0 context.Context, arg1 *types.LiquidityProvisionCancellation, arg2 string) error { m.ctrl.T.Helper() @@ -418,6 +446,20 @@ func (mr *MockExecutionEngineMockRecorder) StartOpeningAuction(arg0, arg1 interf return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartOpeningAuction", reflect.TypeOf((*MockExecutionEngine)(nil).StartOpeningAuction), arg0, arg1) } +// SubmitAMM mocks base method. +func (m *MockExecutionEngine) SubmitAMM(arg0 context.Context, arg1 *types.SubmitAMM, arg2 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SubmitAMM", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// SubmitAMM indicates an expected call of SubmitAMM. +func (mr *MockExecutionEngineMockRecorder) SubmitAMM(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubmitAMM", reflect.TypeOf((*MockExecutionEngine)(nil).SubmitAMM), arg0, arg1, arg2) +} + // SubmitLiquidityProvision mocks base method. func (m *MockExecutionEngine) SubmitLiquidityProvision(arg0 context.Context, arg1 *types.LiquidityProvisionSubmission, arg2, arg3 string) error { m.ctrl.T.Helper() @@ -2107,6 +2149,20 @@ func (mr *MockLimitsMockRecorder) CanTrade() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CanTrade", reflect.TypeOf((*MockLimits)(nil).CanTrade)) } +// CanUseAMMPool mocks base method. +func (m *MockLimits) CanUseAMMPool() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CanUseAMMPool") + ret0, _ := ret[0].(bool) + return ret0 +} + +// CanUseAMMPool indicates an expected call of CanUseAMMPool. +func (mr *MockLimitsMockRecorder) CanUseAMMPool() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CanUseAMMPool", reflect.TypeOf((*MockLimits)(nil).CanUseAMMPool)) +} + // MockStakeVerifier is a mock of StakeVerifier interface. type MockStakeVerifier struct { ctrl *gomock.Controller diff --git a/core/processor/processor.go b/core/processor/processor.go index 7a02ff22717..96429a7af8e 100644 --- a/core/processor/processor.go +++ b/core/processor/processor.go @@ -108,6 +108,10 @@ type ExecutionEngine interface { UpdateMarginMode(ctx context.Context, party, marketID string, marginMode types.MarginMode, marginFactor num.Decimal) error // default chain ID, can be removed once we've upgraded to v0.74 OnChainIDUpdate(uint64) error + + SubmitAMM(ctx context.Context, sub *types.SubmitAMM, deterministicID string) error + AmendAMM(ctx context.Context, sub *types.AmendAMM, deterministicID string) error + CancelAMM(ctx context.Context, sub *types.CancelAMM, deterministicID string) error } type GovernanceEngine interface { @@ -266,6 +270,7 @@ type Limits interface { CanProposeAsset() bool CanProposeSpotMarket() bool CanProposePerpsMarket() bool + CanUseAMMPool() bool CanTrade() bool } diff --git a/core/processor/tx.go b/core/processor/tx.go index c3c73404c47..20c1c73f7f2 100644 --- a/core/processor/tx.go +++ b/core/processor/tx.go @@ -146,6 +146,12 @@ func (t Tx) Command() txn.Command { return txn.BatchProposeCommand case *commandspb.InputData_UpdatePartyProfile: return txn.UpdatePartyProfileCommand + case *commandspb.InputData_SubmitAmm: + return txn.SubmitAMMCommand + case *commandspb.InputData_AmendAmm: + return txn.AmendAMMCommand + case *commandspb.InputData_CancelAmm: + return txn.CancelAMMCommand default: panic(fmt.Sprintf("command %T is not supported", cmd)) } @@ -249,6 +255,12 @@ func (t Tx) GetCmd() interface{} { return cmd.BatchProposalSubmission case *commandspb.InputData_UpdatePartyProfile: return cmd.UpdatePartyProfile + case *commandspb.InputData_SubmitAmm: + return cmd.SubmitAmm + case *commandspb.InputData_AmendAmm: + return cmd.AmendAmm + case *commandspb.InputData_CancelAmm: + return cmd.CancelAmm default: return fmt.Errorf("command %T is not supported", cmd) } @@ -460,6 +472,24 @@ func (t Tx) Unmarshal(i interface{}) error { return errors.New("failed to unmarshall to UpdatePartyProfile") } *underlyingCmd = *cmd.UpdatePartyProfile + case *commandspb.InputData_SubmitAmm: + underlyingCmd, ok := i.(*commandspb.SubmitAMM) + if !ok { + return errors.New("failed to unmarshall to SubmitAMM") + } + *underlyingCmd = *cmd.SubmitAmm + case *commandspb.InputData_AmendAmm: + underlyingCmd, ok := i.(*commandspb.AmendAMM) + if !ok { + return errors.New("failed to unmarshall to AmendAMM") + } + *underlyingCmd = *cmd.AmendAmm + case *commandspb.InputData_CancelAmm: + underlyingCmd, ok := i.(*commandspb.CancelAMM) + if !ok { + return errors.New("failed to unmarshall to CancelAMM") + } + *underlyingCmd = *cmd.CancelAmm default: return fmt.Errorf("command %T is not supported", cmd) } diff --git a/core/protocol/all_services.go b/core/protocol/all_services.go index 1df9a5639c1..b266c9f0e22 100644 --- a/core/protocol/all_services.go +++ b/core/protocol/all_services.go @@ -1028,6 +1028,10 @@ func (svcs *allServices) setupNetParameters(powWatchers []netparams.WatchParam) Param: netparams.PerpsMarketTradingEnabled, Watcher: svcs.limits.OnLimitsProposePerpsMarketEnabledFromUpdate, }, + { + Param: netparams.AMMMarketTradingEnabled, + Watcher: svcs.limits.OnLimitsProposeAMMEnabledUpdate, + }, { Param: netparams.LimitsProposeAssetEnabledFrom, Watcher: svcs.limits.OnLimitsProposeAssetEnabledFromUpdate, @@ -1104,6 +1108,14 @@ func (svcs *allServices) setupNetParameters(powWatchers []netparams.WatchParam) Param: netparams.RewardsActivityStreakInactivityLimit, Watcher: svcs.activityStreak.OnRewardsActivityStreakInactivityLimit, }, + { + Param: netparams.MarketAMMMinCommitmentQuantum, + Watcher: svcs.executionEngine.OnMarketAMMMinCommitmentQuantum, + }, + { + Param: netparams.MarketLiquidityEquityLikeShareFeeFraction, + Watcher: svcs.executionEngine.OnMarketLiquidityEquityLikeShareFeeFractionUpdate, + }, } watchers = append(watchers, powWatchers...) diff --git a/core/risk/engine.go b/core/risk/engine.go index ac0bdba553a..cceff255fff 100644 --- a/core/risk/engine.go +++ b/core/risk/engine.go @@ -248,6 +248,14 @@ func (e *Engine) GetRiskFactors() *types.RiskFactor { return e.factors } +func (e *Engine) GetScalingFactors() *types.ScalingFactors { + return e.marginCalculator.ScalingFactors +} + +func (e *Engine) GetSlippage() num.Decimal { + return e.linearSlippageFactor +} + func (e *Engine) UpdateMarginAuction(ctx context.Context, evts []events.Margin, price *num.Uint, increment num.Decimal, auctionPrice *num.Uint) ([]events.Risk, []events.Margin) { if len(evts) == 0 { return nil, nil diff --git a/core/txn/command.go b/core/txn/command.go index 94f20e1a6cf..5d4ed97b1e1 100644 --- a/core/txn/command.go +++ b/core/txn/command.go @@ -88,6 +88,12 @@ const ( BatchProposeCommand Command = 0x62 // UpdatePartyProfileCommand ... UpdatePartyProfileCommand Command = 0x63 + // SubmitAMMCommand ... + SubmitAMMCommand Command = 0x64 + // AmendAMMCommand ... + AmendAMMCommand Command = 0x65 + // CancelAMMCommand ... + CancelAMMCommand Command = 0x66 ) var commandName = map[Command]string{ @@ -125,6 +131,9 @@ var commandName = map[Command]string{ JoinTeamCommand: "Join Team", BatchProposeCommand: "Batch Proposal", UpdatePartyProfileCommand: "Update Party Profile", + SubmitAMMCommand: "Submit AMM", + AmendAMMCommand: "Amend AMM", + CancelAMMCommand: "Cancel AMM", } func (cmd Command) IsValidatorCommand() bool { diff --git a/core/types/amm.go b/core/types/amm.go new file mode 100644 index 00000000000..66a2cfe9957 --- /dev/null +++ b/core/types/amm.go @@ -0,0 +1,357 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package types + +import ( + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/libs/ptr" + commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" + eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" +) + +// AMMBaseCommand these 3 parameters should be always specified +// in both the the submit and amend commands. +type AMMBaseCommand struct { + MarketID string + Party string + SlippageTolerance num.Decimal + ProposedFee num.Decimal +} + +type ConcentratedLiquidityParameters struct { + Base *num.Uint + LowerBound *num.Uint + UpperBound *num.Uint + MarginRatioAtLowerBound *num.Decimal + MarginRatioAtUpperBound *num.Decimal +} + +func (p *ConcentratedLiquidityParameters) ToProtoEvent() *eventspb.AMMPool_ConcentratedLiquidityParameters { + upper, lower, marginUpper, marginLower := "", "", "", "" + if p.UpperBound != nil { + upper = p.UpperBound.String() + marginUpper = p.MarginRatioAtUpperBound.String() + } + if p.LowerBound != nil { + lower = p.LowerBound.String() + marginLower = p.MarginRatioAtLowerBound.String() + } + return &eventspb.AMMPool_ConcentratedLiquidityParameters{ + Base: p.Base.String(), + LowerBound: lower, + UpperBound: upper, + MarginRatioAtUpperBound: marginUpper, + MarginRatioAtLowerBound: marginLower, + } +} + +func (p *ConcentratedLiquidityParameters) ApplyUpdate(update *ConcentratedLiquidityParameters) { + if update == nil { + return + } + if update.Base != nil { + p.Base = update.Base + } + + if update.LowerBound != nil { + p.LowerBound = update.LowerBound + } + + if update.UpperBound != nil { + p.UpperBound = update.UpperBound + } + + if update.MarginRatioAtLowerBound != nil { + p.MarginRatioAtLowerBound = update.MarginRatioAtLowerBound + } + + if update.MarginRatioAtUpperBound != nil { + p.MarginRatioAtUpperBound = update.MarginRatioAtUpperBound + } +} + +func (p ConcentratedLiquidityParameters) Clone() *ConcentratedLiquidityParameters { + ret := &ConcentratedLiquidityParameters{} + if p.Base != nil { + ret.Base = p.Base.Clone() + } + if p.LowerBound != nil { + ret.LowerBound = p.LowerBound.Clone() + } + if p.UpperBound != nil { + ret.UpperBound = p.UpperBound.Clone() + } + if p.MarginRatioAtLowerBound != nil { + cpy := *p.MarginRatioAtLowerBound + ret.MarginRatioAtLowerBound = &cpy + } + if p.MarginRatioAtUpperBound != nil { + cpy := *p.MarginRatioAtUpperBound + ret.MarginRatioAtUpperBound = &cpy + } + return ret +} + +func (p ConcentratedLiquidityParameters) IntoProto() *commandspb.SubmitAMM_ConcentratedLiquidityParameters { + ret := &commandspb.SubmitAMM_ConcentratedLiquidityParameters{} + return ret +} + +type SubmitAMM struct { + AMMBaseCommand + CommitmentAmount *num.Uint + Parameters *ConcentratedLiquidityParameters +} + +func NewSubmitAMMFromProto( + submitAMM *commandspb.SubmitAMM, + party string, +) *SubmitAMM { + // all parameters have been validated by the command package here. + var ( + upperBound, lowerBound *num.Uint + upperMargin, lowerMargin *num.Decimal + ) + + commitment, _ := num.UintFromString(submitAMM.CommitmentAmount, 10) + base, _ := num.UintFromString(submitAMM.ConcentratedLiquidityParameters.Base, 10) + if submitAMM.ConcentratedLiquidityParameters.LowerBound != nil { + lowerBound, _ = num.UintFromString(*submitAMM.ConcentratedLiquidityParameters.LowerBound, 10) + lm, _ := num.DecimalFromString(*submitAMM.ConcentratedLiquidityParameters.MarginRatioAtLowerBound) + lowerMargin = ptr.From(lm) + } + if submitAMM.ConcentratedLiquidityParameters.UpperBound != nil { + upperBound, _ = num.UintFromString(*submitAMM.ConcentratedLiquidityParameters.UpperBound, 10) + // this must be set if upper bound is set + um, _ := num.DecimalFromString(*submitAMM.ConcentratedLiquidityParameters.MarginRatioAtUpperBound) + upperMargin = ptr.From(um) + } + + slippage, _ := num.DecimalFromString(submitAMM.SlippageTolerance) + proposedFee, _ := num.DecimalFromString(submitAMM.ProposedFee) + + return &SubmitAMM{ + AMMBaseCommand: AMMBaseCommand{ + Party: party, + MarketID: submitAMM.MarketId, + SlippageTolerance: slippage, + ProposedFee: proposedFee, + }, + CommitmentAmount: commitment, + Parameters: &ConcentratedLiquidityParameters{ + Base: base, + LowerBound: lowerBound, + UpperBound: upperBound, + MarginRatioAtLowerBound: lowerMargin, + MarginRatioAtUpperBound: upperMargin, + }, + } +} + +func (s SubmitAMM) IntoProto() *commandspb.SubmitAMM { + // set defaults, this is why we don't use a pointer receiver + zero := num.UintZero() // this call clones, we are just calling String(), so we only need a single 0-value + if s.CommitmentAmount == nil { + s.CommitmentAmount = zero + } + // create a shallow copy, because this field is a pointer, we mustn't reassign anything + cpy := *s.Parameters + s.Parameters = &cpy + // this should be split to a different function, because this is modifying the + var lower, upper, marginLower, marginUpper *string + var base string + if s.Parameters.LowerBound != nil { + lower = ptr.From(s.Parameters.LowerBound.String()) + marginLower = ptr.From(s.Parameters.MarginRatioAtLowerBound.String()) + } + if s.Parameters.UpperBound != nil { + upper = ptr.From(s.Parameters.UpperBound.String()) + marginUpper = ptr.From(s.Parameters.MarginRatioAtUpperBound.String()) + } + if s.Parameters.Base != nil { + base = s.Parameters.Base.String() + } + return &commandspb.SubmitAMM{ + MarketId: s.MarketID, + CommitmentAmount: s.CommitmentAmount.String(), + SlippageTolerance: s.SlippageTolerance.String(), + ProposedFee: s.ProposedFee.String(), + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + UpperBound: upper, + LowerBound: lower, + Base: base, + MarginRatioAtUpperBound: marginUpper, + MarginRatioAtLowerBound: marginLower, + }, + } +} + +type AmendAMM struct { + AMMBaseCommand + CommitmentAmount *num.Uint + Parameters *ConcentratedLiquidityParameters +} + +func (a AmendAMM) IntoProto() *commandspb.AmendAMM { + ret := &commandspb.AmendAMM{ + MarketId: a.MarketID, + CommitmentAmount: nil, + SlippageTolerance: a.SlippageTolerance.String(), + ProposedFee: nil, + } + if a.CommitmentAmount != nil { + ret.CommitmentAmount = ptr.From(a.CommitmentAmount.String()) + } + if !a.ProposedFee.IsZero() { + ret.ProposedFee = ptr.From(a.ProposedFee.String()) + } + if a.Parameters == nil { + return ret + } + ret.ConcentratedLiquidityParameters = &commandspb.AmendAMM_ConcentratedLiquidityParameters{} + if a.Parameters.Base != nil { + ret.ConcentratedLiquidityParameters.Base = ptr.From(a.Parameters.Base.String()) + } + if a.Parameters.LowerBound != nil { + ret.ConcentratedLiquidityParameters.LowerBound = ptr.From(a.Parameters.LowerBound.String()) + } + if a.Parameters.UpperBound != nil { + ret.ConcentratedLiquidityParameters.UpperBound = ptr.From(a.Parameters.UpperBound.String()) + } + if a.Parameters.MarginRatioAtLowerBound != nil { + ret.ConcentratedLiquidityParameters.MarginRatioAtLowerBound = ptr.From(a.Parameters.MarginRatioAtLowerBound.String()) + } + if a.Parameters.MarginRatioAtUpperBound != nil { + ret.ConcentratedLiquidityParameters.MarginRatioAtUpperBound = ptr.From(a.Parameters.MarginRatioAtUpperBound.String()) + } + return ret +} + +func NewAmendAMMFromProto( + amendAMM *commandspb.AmendAMM, + party string, +) *AmendAMM { + // all parameters have been validated by the command package here. + + var commitment, base, lowerBound, upperBound *num.Uint + var marginRatioAtUpperBound, marginRatioAtLowerBound *num.Decimal + + // this is optional + if amendAMM.CommitmentAmount != nil { + commitment, _ = num.UintFromString(*amendAMM.CommitmentAmount, 10) + } + + // this too, and the parameters it contains + if amendAMM.ConcentratedLiquidityParameters != nil { + if amendAMM.ConcentratedLiquidityParameters.Base != nil { + base, _ = num.UintFromString(*amendAMM.ConcentratedLiquidityParameters.Base, 10) + } + if amendAMM.ConcentratedLiquidityParameters.LowerBound != nil { + lowerBound, _ = num.UintFromString(*amendAMM.ConcentratedLiquidityParameters.LowerBound, 10) + } + if amendAMM.ConcentratedLiquidityParameters.UpperBound != nil { + upperBound, _ = num.UintFromString(*amendAMM.ConcentratedLiquidityParameters.UpperBound, 10) + } + if amendAMM.ConcentratedLiquidityParameters.MarginRatioAtLowerBound != nil { + marginRatio, _ := num.DecimalFromString(*amendAMM.ConcentratedLiquidityParameters.MarginRatioAtLowerBound) + marginRatioAtLowerBound = ptr.From(marginRatio) + } + if amendAMM.ConcentratedLiquidityParameters.MarginRatioAtUpperBound != nil { + marginRatio, _ := num.DecimalFromString(*amendAMM.ConcentratedLiquidityParameters.MarginRatioAtUpperBound) + marginRatioAtUpperBound = ptr.From(marginRatio) + } + } + + slippage, _ := num.DecimalFromString(amendAMM.SlippageTolerance) + + var proposedFee num.Decimal + if amendAMM.ProposedFee != nil { + proposedFee, _ = num.DecimalFromString(*amendAMM.ProposedFee) + } + + return &AmendAMM{ + AMMBaseCommand: AMMBaseCommand{ + Party: party, + MarketID: amendAMM.MarketId, + SlippageTolerance: slippage, + ProposedFee: proposedFee, + }, + CommitmentAmount: commitment, + Parameters: &ConcentratedLiquidityParameters{ + Base: base, + LowerBound: lowerBound, + UpperBound: upperBound, + MarginRatioAtUpperBound: marginRatioAtUpperBound, + MarginRatioAtLowerBound: marginRatioAtLowerBound, + }, + } +} + +type CancelAMM struct { + MarketID string + Party string + Method AMMPoolCancellationMethod +} + +func (c CancelAMM) IntoProto() *commandspb.CancelAMM { + return &commandspb.CancelAMM{ + MarketId: c.MarketID, + Method: c.Method, + } +} + +func NewCancelAMMFromProto( + cancelAMM *commandspb.CancelAMM, + party string, +) *CancelAMM { + return &CancelAMM{ + MarketID: cancelAMM.MarketId, + Party: party, + Method: cancelAMM.Method, + } +} + +type AMMPoolCancellationMethod = commandspb.CancelAMM_Method + +const ( + AMMPoolCancellationMethodUnspecified AMMPoolCancellationMethod = commandspb.CancelAMM_METHOD_UNSPECIFIED + AMMPoolCancellationMethodImmediate = commandspb.CancelAMM_METHOD_IMMEDIATE + AMMPoolCancellationMethodReduceOnly = commandspb.CancelAMM_METHOD_REDUCE_ONLY +) + +type AMMPoolStatusReason = eventspb.AMMPool_StatusReason + +const ( + AMMPoolStatusReasonUnspecified AMMPoolStatusReason = eventspb.AMMPool_STATUS_REASON_UNSPECIFIED + AMMPoolStatusReasonCancelledByParty = eventspb.AMMPool_STATUS_REASON_CANCELLED_BY_PARTY + AMMPoolStatusReasonCannotFillCommitment = eventspb.AMMPool_STATUS_REASON_CANNOT_FILL_COMMITMENT + AMMPoolStatusReasonPartyAlreadyOwnsAPool = eventspb.AMMPool_STATUS_REASON_PARTY_ALREADY_OWNS_A_POOL + AMMPoolStatusReasonPartyClosedOut = eventspb.AMMPool_STATUS_REASON_PARTY_CLOSED_OUT + AMMPoolStatusReasonMarketClosed = eventspb.AMMPool_STATUS_REASON_MARKET_CLOSED + AMMPoolStatusReasonCommitmentTooLow = eventspb.AMMPool_STATUS_REASON_COMMITMENT_TOO_LOW + AMMPoolStatusReasonCannotRebase = eventspb.AMMPool_STATUS_REASON_CANNOT_REBASE +) + +type AMMPoolStatus = eventspb.AMMPool_Status + +const ( + AMMPoolStatusUnspecified AMMPoolStatus = eventspb.AMMPool_STATUS_UNSPECIFIED + AMMPoolStatusActive = eventspb.AMMPool_STATUS_ACTIVE + AMMPoolStatusRejected = eventspb.AMMPool_STATUS_REJECTED + AMMPoolStatusCancelled = eventspb.AMMPool_STATUS_CANCELLED + AMMPoolStatusStopped = eventspb.AMMPool_STATUS_STOPPED + AMMPoolStatusReduceOnly = eventspb.AMMPool_STATUS_REDUCE_ONLY +) diff --git a/core/types/matching.go b/core/types/matching.go index 9cfe1147e02..16968627a2c 100644 --- a/core/types/matching.go +++ b/core/types/matching.go @@ -27,29 +27,30 @@ import ( ) type Order struct { - ID string - MarketID string - Party string - Side Side - Price *num.Uint - OriginalPrice *num.Uint - Size uint64 - Remaining uint64 - TimeInForce OrderTimeInForce - Type OrderType - CreatedAt int64 - Status OrderStatus - ExpiresAt int64 - Reference string - Reason OrderError - UpdatedAt int64 - Version uint64 - BatchID uint64 - PeggedOrder *PeggedOrder - PostOnly bool - ReduceOnly bool - extraRemaining uint64 - IcebergOrder *IcebergOrder + ID string + MarketID string + Party string + Side Side + Price *num.Uint + OriginalPrice *num.Uint + Size uint64 + Remaining uint64 + TimeInForce OrderTimeInForce + Type OrderType + CreatedAt int64 + Status OrderStatus + ExpiresAt int64 + Reference string + Reason OrderError + UpdatedAt int64 + Version uint64 + BatchID uint64 + PeggedOrder *PeggedOrder + PostOnly bool + ReduceOnly bool + extraRemaining uint64 + IcebergOrder *IcebergOrder + GeneratedOffbook bool } func (o *Order) ReduceOnlyAdjustRemaining(extraSize uint64) { @@ -960,6 +961,16 @@ var ( ErrOrderNotInTickSize = OrderErrorPriceNotInTickSize ) +func OtherSide(s Side) Side { + switch s { + case SideBuy: + return SideSell + case SideSell: + return SideBuy + } + return SideUnspecified +} + func IsOrderError(err error) (OrderError, bool) { oerr, ok := err.(OrderError) return oerr, ok diff --git a/core/types/snapshot_nodes.go b/core/types/snapshot_nodes.go index c534790828d..cbb238d79fb 100644 --- a/core/types/snapshot_nodes.go +++ b/core/types/snapshot_nodes.go @@ -408,6 +408,7 @@ type ExecMarket struct { PartyMarginFactors []*snapshot.PartyMarginFactor MarkPriceCalculator *snapshot.CompositePriceCalculator InternalCompositePriceCalculator *snapshot.CompositePriceCalculator + Amm *snapshot.AmmState MarketLiquidity *snapshot.MarketLiquidity } @@ -526,6 +527,7 @@ type LimitState struct { ProposeSpotMarketEnabled bool ProposePerpsMarketEnabled bool ProposeAssetEnabled bool + CanUseAMMEnabled bool ProposeMarketEnabledFrom time.Time ProposeAssetEnabledFrom time.Time } @@ -2044,6 +2046,7 @@ func LimitFromProto(l *snapshot.LimitState) *LimitState { ProposePerpsMarketEnabled: l.ProposePerpsMarketEnabled, ProposeAssetEnabledFrom: time.Time{}, ProposeMarketEnabledFrom: time.Time{}, + CanUseAMMEnabled: l.CanUseAmmEnabled, } if l.ProposeAssetEnabledFrom != -1 { @@ -2646,6 +2649,7 @@ func (l *LimitState) IntoProto() *snapshot.LimitState { ProposeAssetEnabled: l.ProposeAssetEnabled, ProposeMarketEnabledFrom: l.ProposeMarketEnabledFrom.UnixNano(), ProposeAssetEnabledFrom: l.ProposeAssetEnabledFrom.UnixNano(), + CanUseAmmEnabled: l.CanUseAMMEnabled, } // Use -1 to mean it hasn't been set @@ -3032,6 +3036,7 @@ func ExecMarketFromProto(em *snapshot.Market) *ExecMarket { PartyMarginFactors: em.PartyMarginFactor, MarkPriceCalculator: em.MarkPriceCalculator, InternalCompositePriceCalculator: em.InternalCompositePriceCalculator, + Amm: em.Amm, MarketLiquidity: em.MarketLiquidity, } @@ -3077,6 +3082,7 @@ func (e ExecMarket) IntoProto() *snapshot.Market { MarkPriceCalculator: e.MarkPriceCalculator, InternalCompositePriceCalculator: e.InternalCompositePriceCalculator, MarketLiquidity: e.MarketLiquidity, + Amm: e.Amm, } if e.CurrentMarkPrice != nil { diff --git a/core/types/transfer.go b/core/types/transfer.go index 295805659e5..8a6942bc682 100644 --- a/core/types/transfer.go +++ b/core/types/transfer.go @@ -218,4 +218,8 @@ const ( TransferTypeOrderMarginLow TransferType = proto.TransferType_TRANSFER_TYPE_ORDER_MARGIN_LOW TransferTypeOrderMarginHigh TransferType = proto.TransferType_TRANSFER_TYPE_ORDER_MARGIN_HIGH TransferTypeIsolatedMarginLow TransferType = proto.TransferType_TRANSFER_TYPE_ISOLATED_MARGIN_LOW + // AMM account juggling. + TransferTypeAMMSubAccountLow TransferType = proto.TransferType_TRANSFER_TYPE_AMM_SUBACCOUNT_LOW + TransferTypeAMMSubAccountHigh TransferType = proto.TransferType_TRANSFER_TYPE_AMM_SUBACCOUNT_HIGH + TransferTypeAMMSubAccountRelease TransferType = proto.TransferType_TRANSFER_TYPE_AMM_SUBACCOUNT_RELEASE ) diff --git a/datanode/api/errors.go b/datanode/api/errors.go index 71d4dac18e0..84c69213e85 100644 --- a/datanode/api/errors.go +++ b/datanode/api/errors.go @@ -341,6 +341,8 @@ var ( ErrGetTimeWeightedNotionalPosition = errors.New("failed to get time weighted notional position") ErrDateRangeValidationFailed = newInvalidArgumentError("invalid date range") + + ErrListAMMPools = errors.New("failed to list AMM pools") ) // errorMap contains a mapping between errors and Vega numeric error codes. diff --git a/datanode/api/server.go b/datanode/api/server.go index ea8e9912b52..0533305ce8c 100644 --- a/datanode/api/server.go +++ b/datanode/api/server.go @@ -180,6 +180,7 @@ type GRPCServer struct { gamesService *service.Games marginModesService *service.MarginModes timeWeightedNotionalPositionService *service.TimeWeightedNotionalPosition + ammPoolService *service.AMMPools eventObserver *eventObserver @@ -250,6 +251,7 @@ func NewGRPCServer( gameService *service.Games, marginModesService *service.MarginModes, timeWeightedNotionalPositionService *service.TimeWeightedNotionalPosition, + ammPoolService *service.AMMPools, ) *GRPCServer { // setup logger log = log.Named(namedLogger) @@ -319,6 +321,7 @@ func NewGRPCServer( gamesService: gameService, marginModesService: marginModesService, timeWeightedNotionalPositionService: timeWeightedNotionalPositionService, + ammPoolService: ammPoolService, eventObserver: &eventObserver{ log: log, @@ -558,6 +561,7 @@ func (g *GRPCServer) Start(ctx context.Context, lis net.Listener) error { gamesService: g.gamesService, marginModesService: g.marginModesService, twNotionalPositionService: g.timeWeightedNotionalPositionService, + ammPoolService: g.ammPoolService, } protoapi.RegisterTradingDataServiceServer(g.srv, tradingDataSvcV2) diff --git a/datanode/api/trading_data_v2.go b/datanode/api/trading_data_v2.go index ef8e86e64a5..686d536b545 100644 --- a/datanode/api/trading_data_v2.go +++ b/datanode/api/trading_data_v2.go @@ -131,6 +131,7 @@ type TradingDataServiceV2 struct { gamesService *service.Games marginModesService *service.MarginModes twNotionalPositionService *service.TimeWeightedNotionalPosition + ammPoolService *service.AMMPools } func (t *TradingDataServiceV2) GetPartyVestingStats( @@ -5246,3 +5247,47 @@ func (t *TradingDataServiceV2) GetTimeWeightedNotionalPosition(ctx context.Conte TimeWeightedNotionalPosition: pos.ToProto(), }, nil } + +func (t *TradingDataServiceV2) ListAMMPools(ctx context.Context, req *v2.ListAMMPoolsRequest) (*v2.ListAMMPoolsResponse, error) { + defer metrics.StartAPIRequestAndTimeGRPC("ListAMMPools")() + + pagination, err := entities.CursorPaginationFromProto(req.Pagination) + if err != nil { + return nil, formatE(ErrInvalidPagination, err) + } + + var ( + pools []entities.AMMPool + pageInfo entities.PageInfo + ) + + if req.PartyId != nil { + pools, pageInfo, err = t.ammPoolService.ListByParty(ctx, entities.PartyID(*req.PartyId), pagination) + } else if req.MarketId != nil { + pools, pageInfo, err = t.ammPoolService.ListByMarket(ctx, entities.MarketID(*req.MarketId), pagination) + } else if req.PoolId != nil { + pools, pageInfo, err = t.ammPoolService.ListByPool(ctx, entities.AMMPoolID(*req.PoolId), pagination) + } else if req.SubAccount != nil { + pools, pageInfo, err = t.ammPoolService.ListBySubAccount(ctx, entities.AccountID(*req.SubAccount), pagination) + } else if req.Status != nil { + pools, pageInfo, err = t.ammPoolService.ListByStatus(ctx, entities.AMMPoolStatus(*req.Status), pagination) + } else { + pools, pageInfo, err = t.ammPoolService.ListAll(ctx, pagination) + } + + if err != nil { + return nil, formatE(ErrListAMMPools, err) + } + + edges, err := makeEdges[*v2.AMMPoolEdge](pools) + if err != nil { + return nil, formatE(err) + } + + return &v2.ListAMMPoolsResponse{ + AmmPools: &v2.AMMPoolsConnection{ + Edges: edges, + PageInfo: pageInfo.ToProto(), + }, + }, nil +} diff --git a/datanode/api/trading_test.go b/datanode/api/trading_test.go index d0f2c6c6b57..3d869475d96 100644 --- a/datanode/api/trading_test.go +++ b/datanode/api/trading_test.go @@ -165,6 +165,7 @@ func getTestGRPCServer(t *testing.T, ctx context.Context) (tidy func(), conn *gr gameService := service.NewGames(sqlstore.NewGames(sqlConn)) marginModesService := service.NewMarginModes(sqlstore.NewMarginModes(sqlConn)) timeWeightedNotionPositionService := service.NewTimeWeightedNotionalPosition(sqlstore.NewTimeWeightedNotionalPosition(sqlConn)) + ammPoolsService := service.NewAMMPools(sqlstore.NewAMMPools(sqlConn)) g := api.NewGRPCServer( logger, @@ -225,6 +226,7 @@ func getTestGRPCServer(t *testing.T, ctx context.Context) (tidy func(), conn *gr gameService, marginModesService, timeWeightedNotionPositionService, + ammPoolsService, ) if g == nil { err = fmt.Errorf("failed to create gRPC server") diff --git a/datanode/broker/convert.go b/datanode/broker/convert.go index 3b21289d6ff..58a64aab0c8 100644 --- a/datanode/broker/convert.go +++ b/datanode/broker/convert.go @@ -196,6 +196,8 @@ func toEvent(ctx context.Context, be *eventspb.BusEvent) events.Event { return events.TimeWeightedNotionalPositionUpdatedEventFromStream(ctx, be) case eventspb.BusEventType_BUS_EVENT_TYPE_CANCELLED_ORDERS: return events.CancelledOrdersEventFromStream(ctx, be) + case eventspb.BusEventType_BUS_EVENT_TYPE_AMM_POOL: + return events.AMMPoolEventFromStream(ctx, be) } return nil diff --git a/datanode/entities/amm_pool.go b/datanode/entities/amm_pool.go new file mode 100644 index 00000000000..b6902217aed --- /dev/null +++ b/datanode/entities/amm_pool.go @@ -0,0 +1,169 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package entities + +import ( + "encoding/json" + "fmt" + "time" + + "code.vegaprotocol.io/vega/libs/num" + v2 "code.vegaprotocol.io/vega/protos/data-node/api/v2" + eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" +) + +type _AMMPoolID struct{} + +type AMMPoolID = ID[_AMMPoolID] + +type AMMPool struct { + PartyID PartyID + MarketID MarketID + PoolID AMMPoolID + SubAccount AccountID + Commitment num.Decimal + Status AMMPoolStatus + StatusReason AMMPoolStatusReason + ParametersBase num.Decimal + ParametersLowerBound num.Decimal + ParametersUpperBound num.Decimal + ParametersMarginRatioAtLowerBound num.Decimal + ParametersMarginRatioAtUpperBound num.Decimal + CreatedAt time.Time + LastUpdated time.Time +} + +type AMMPoolsFilter interface { + *PartyID | *MarketID | *AMMPoolID | *AccountID | *AMMPoolStatus + + // Where clause generated by the filter to be used in SQL queries. + // Optionally override the default field name defined on the implemented filter + // with the provided field name by providing a not nil value for the field name + Where(fieldName *string, nextBindVar func(*[]any, any) string, args ...any) (string, []any) +} + +func AMMPoolFromProto(pool *eventspb.AMMPool, vegaTime time.Time) (AMMPool, error) { + var ( + commitment, + parametersBase, + parametersLowerBound, + parametersUpperBound, + parametersMarginRatioAtLowerBound, + parametersMarginRatioAtUpperBound num.Decimal + err error + ) + partyID := PartyID(pool.PartyId) + marketID := MarketID(pool.MarketId) + poolID := AMMPoolID(pool.PoolId) + accountID := AccountID(pool.SubAccount) + if commitment, err = num.DecimalFromString(pool.Commitment); err != nil { + return AMMPool{}, err + } + status := AMMPoolStatus(pool.Status) + statusReason := AMMPoolStatusReason(pool.StatusReason) + if parametersBase, err = num.DecimalFromString(pool.Parameters.Base); err != nil { + return AMMPool{}, err + } + if parametersLowerBound, err = num.DecimalFromString(pool.Parameters.LowerBound); err != nil { + return AMMPool{}, err + } + if parametersUpperBound, err = num.DecimalFromString(pool.Parameters.UpperBound); err != nil { + return AMMPool{}, err + } + if parametersMarginRatioAtLowerBound, err = num.DecimalFromString(pool.Parameters.MarginRatioAtLowerBound); err != nil { + return AMMPool{}, err + } + if parametersMarginRatioAtUpperBound, err = num.DecimalFromString(pool.Parameters.MarginRatioAtUpperBound); err != nil { + return AMMPool{}, err + } + + return AMMPool{ + PartyID: partyID, + MarketID: marketID, + PoolID: poolID, + SubAccount: accountID, + Commitment: commitment, + Status: status, + StatusReason: statusReason, + ParametersBase: parametersBase, + ParametersLowerBound: parametersLowerBound, + ParametersUpperBound: parametersUpperBound, + ParametersMarginRatioAtLowerBound: parametersMarginRatioAtLowerBound, + ParametersMarginRatioAtUpperBound: parametersMarginRatioAtUpperBound, + CreatedAt: vegaTime, + LastUpdated: vegaTime, + }, nil +} + +func (p AMMPool) ToProto() *eventspb.AMMPool { + return &eventspb.AMMPool{ + PartyId: p.PartyID.String(), + MarketId: p.MarketID.String(), + PoolId: p.PoolID.String(), + SubAccount: p.SubAccount.String(), + Commitment: p.Commitment.String(), + Status: eventspb.AMMPool_Status(p.Status), + StatusReason: eventspb.AMMPool_StatusReason(p.StatusReason), + Parameters: &eventspb.AMMPool_ConcentratedLiquidityParameters{ + Base: p.ParametersBase.String(), + LowerBound: p.ParametersLowerBound.String(), + UpperBound: p.ParametersUpperBound.String(), + MarginRatioAtLowerBound: p.ParametersMarginRatioAtLowerBound.String(), + MarginRatioAtUpperBound: p.ParametersMarginRatioAtUpperBound.String(), + }, + } +} + +type AMMPoolCursor struct { + CreatedAt time.Time + PartyID PartyID + MarketID MarketID + PoolID AMMPoolID + SubAccount AccountID +} + +func (c AMMPoolCursor) String() string { + bs, err := json.Marshal(c) + if err != nil { + panic(fmt.Errorf("could not marshal AMM pool cursor: %v", err)) + } + return string(bs) +} + +func (c *AMMPoolCursor) Parse(cursorString string) error { + if cursorString == "" { + return nil + } + return json.Unmarshal([]byte(cursorString), c) +} + +func (p AMMPool) Cursor() *Cursor { + pc := AMMPoolCursor{ + CreatedAt: p.CreatedAt, + PartyID: p.PartyID, + MarketID: p.MarketID, + PoolID: p.PoolID, + SubAccount: p.SubAccount, + } + return NewCursor(pc.String()) +} + +func (p AMMPool) ToProtoEdge(_ ...any) (*v2.AMMPoolEdge, error) { + return &v2.AMMPoolEdge{ + Node: p.ToProto(), + Cursor: p.Cursor().Encode(), + }, nil +} diff --git a/datanode/entities/entities.go b/datanode/entities/entities.go index 801b49f361c..a20a4d3af37 100644 --- a/datanode/entities/entities.go +++ b/datanode/entities/entities.go @@ -27,7 +27,7 @@ type Entities interface { LiquidityProvider | FundingPeriod | FundingPeriodDataPoint | ReferralSet | ReferralSetRefereeStats | FlattenReferralSetStats | Team | TeamMember | TeamMemberHistory | FundingPayment | FlattenVolumeDiscountStats | PaidLiquidityFeesStats | CurrentAndPreviousLiquidityProvisions | TransferDetails | Game | TeamsStatistics | TeamMembersStatistics | - PartyMarginMode | PartyProfile + PartyMarginMode | PartyProfile | AMMPool } type PagedEntity[T proto.Message] interface { diff --git a/datanode/entities/enums.go b/datanode/entities/enums.go index eb3474a46fa..239a8101eac 100644 --- a/datanode/entities/enums.go +++ b/datanode/entities/enums.go @@ -1065,6 +1065,71 @@ func (m *MarginMode) DecodeText(_ *pgtype.ConnInfo, src []byte) error { return nil } +type AMMPoolStatus eventspb.AMMPool_Status + +const ( + AMMPoolStatusUnspecified = AMMPoolStatus(eventspb.AMMPool_STATUS_UNSPECIFIED) + AMMPoolStatusActive = AMMPoolStatus(eventspb.AMMPool_STATUS_ACTIVE) + AMMPoolStatusRejected = AMMPoolStatus(eventspb.AMMPool_STATUS_REJECTED) + AMMPoolStatusCancelled = AMMPoolStatus(eventspb.AMMPool_STATUS_CANCELLED) + AMMPoolStatusStopped = AMMPoolStatus(eventspb.AMMPool_STATUS_STOPPED) +) + +func (s AMMPoolStatus) EncodeText(_ *pgtype.ConnInfo, buf []byte) ([]byte, error) { + status, ok := eventspb.AMMPool_Status_name[int32(s)] + if !ok { + return buf, fmt.Errorf("unknown AMM pool status: %v", s) + } + return append(buf, []byte(status)...), nil +} + +func (s *AMMPoolStatus) DecodeText(_ *pgtype.ConnInfo, src []byte) error { + val, ok := eventspb.AMMPool_Status_value[string(src)] + if !ok { + return fmt.Errorf("unknown AMM pool status: %s", src) + } + *s = AMMPoolStatus(val) + return nil +} + +func (s *AMMPoolStatus) Where(fieldName *string, nextBindVar func(args *[]any, arg any) string, args ...any) (string, []any) { + if fieldName == nil { + return fmt.Sprintf("status = %s", nextBindVar(&args, s)), args + } + + return fmt.Sprintf("%s = %s", *fieldName, nextBindVar(&args, s)), args +} + +type AMMPoolStatusReason eventspb.AMMPool_StatusReason + +const ( + AMMPoolStatusReasonUnspecified = AMMPoolStatusReason(eventspb.AMMPool_STATUS_REASON_UNSPECIFIED) + AMMPoolStatusReasonCancelledByParty = AMMPoolStatusReason(eventspb.AMMPool_STATUS_REASON_CANCELLED_BY_PARTY) + AMMPoolStatusReasonCannotFillCommitment = AMMPoolStatusReason(eventspb.AMMPool_STATUS_REASON_CANNOT_FILL_COMMITMENT) + AMMPoolStatusReasonPartyAlreadyOwnsAPool = AMMPoolStatusReason(eventspb.AMMPool_STATUS_REASON_PARTY_ALREADY_OWNS_A_POOL) + AMMPoolStatusReasonPartyClosedOut = AMMPoolStatusReason(eventspb.AMMPool_STATUS_REASON_PARTY_CLOSED_OUT) + AMMPoolStatusReasonMarketClosed = AMMPoolStatusReason(eventspb.AMMPool_STATUS_REASON_MARKET_CLOSED) + AMMPoolStatusReasonCommitmentTooLow = AMMPoolStatusReason(eventspb.AMMPool_STATUS_REASON_COMMITMENT_TOO_LOW) + AMMPoolStatusReasonCannotRebase = AMMPoolStatusReason(eventspb.AMMPool_STATUS_REASON_CANNOT_REBASE) +) + +func (s AMMPoolStatusReason) EncodeText(_ *pgtype.ConnInfo, buf []byte) ([]byte, error) { + status, ok := eventspb.AMMPool_StatusReason_name[int32(s)] + if !ok { + return buf, fmt.Errorf("unknown AMM pool status reason: %v", s) + } + return append(buf, []byte(status)...), nil +} + +func (s *AMMPoolStatusReason) DecodeText(_ *pgtype.ConnInfo, src []byte) error { + val, ok := eventspb.AMMPool_StatusReason_value[string(src)] + if !ok { + return fmt.Errorf("unknown AMM pool status reason: %s", src) + } + *s = AMMPoolStatusReason(val) + return nil +} + type ProtoEnum interface { GetEnums() map[int32]string } diff --git a/datanode/entities/id.go b/datanode/entities/id.go index fcf81849495..f75e6bbea09 100644 --- a/datanode/entities/id.go +++ b/datanode/entities/id.go @@ -107,3 +107,10 @@ func (id ID[T]) EncodeBinary(ci *pgtype.ConnInfo, buf []byte) ([]byte, error) { func (id *ID[T]) DecodeBinary(ci *pgtype.ConnInfo, src []byte) error { return id.SetBytes(src) } + +func (id *ID[T]) Where(fieldName *string, nextBindVar func(args *[]any, arg any) string, args ...any) (string, []any) { + if fieldName == nil { + return fmt.Sprintf("id = %s", nextBindVar(&args, id)), args + } + return fmt.Sprintf("%s = %s", *fieldName, nextBindVar(&args, id)), args +} diff --git a/datanode/gateway/graphql/generated.go b/datanode/gateway/graphql/generated.go index 3a48f1964ac..37b7207cd8d 100644 --- a/datanode/gateway/graphql/generated.go +++ b/datanode/gateway/graphql/generated.go @@ -195,6 +195,27 @@ type DirectiveRoot struct { } type ComplexityRoot struct { + AMMPool struct { + Commitment func(childComplexity int) int + MarketId func(childComplexity int) int + Parameters func(childComplexity int) int + PartyId func(childComplexity int) int + PoolId func(childComplexity int) int + Status func(childComplexity int) int + StatusReason func(childComplexity int) int + SubAccount func(childComplexity int) int + } + + AMMPoolEdge struct { + Cursor func(childComplexity int) int + Node func(childComplexity int) int + } + + AMMPoolsConnection struct { + Edges func(childComplexity int) int + PageInfo func(childComplexity int) int + } + AbstractMarginLevels struct { Asset func(childComplexity int) int CollateralReleaseLevel func(childComplexity int) int @@ -434,6 +455,14 @@ type ComplexityRoot struct { PriceSources func(childComplexity int) int } + ConcentratedLiquidityParameters struct { + Base func(childComplexity int) int + LowerBound func(childComplexity int) int + MarginRatioAtLowerBound func(childComplexity int) int + MarginRatioAtUpperBound func(childComplexity int) int + UpperBound func(childComplexity int) int + } + Condition struct { Operator func(childComplexity int) int Value func(childComplexity int) int @@ -2103,6 +2132,7 @@ type ComplexityRoot struct { } Query struct { + AmmPools func(childComplexity int, partyID *string, marketID *string, poolID *string, subAccountID *string, status *v1.AMMPool_Status, pagination *v2.Pagination) int Asset func(childComplexity int, id string) int AssetsConnection func(childComplexity int, id *string, pagination *v2.Pagination) int BalanceChanges func(childComplexity int, filter *v2.AccountFilter, dateRange *v2.DateRange, pagination *v2.Pagination) int @@ -3551,6 +3581,7 @@ type QuantumVolumesPerEpochResolver interface { Epoch(ctx context.Context, obj *v2.QuantumVolumesPerEpoch) (int, error) } type QueryResolver interface { + AmmPools(ctx context.Context, partyID *string, marketID *string, poolID *string, subAccountID *string, status *v1.AMMPool_Status, pagination *v2.Pagination) (*v2.AMMPoolsConnection, error) Asset(ctx context.Context, id string) (*vega.Asset, error) AssetsConnection(ctx context.Context, id *string, pagination *v2.Pagination) (*v2.AssetsConnection, error) BalanceChanges(ctx context.Context, filter *v2.AccountFilter, dateRange *v2.DateRange, pagination *v2.Pagination) (*v2.AggregatedBalanceConnection, error) @@ -3921,6 +3952,90 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in _ = ec switch typeName + "." + field { + case "AMMPool.commitment": + if e.complexity.AMMPool.Commitment == nil { + break + } + + return e.complexity.AMMPool.Commitment(childComplexity), true + + case "AMMPool.marketID": + if e.complexity.AMMPool.MarketId == nil { + break + } + + return e.complexity.AMMPool.MarketId(childComplexity), true + + case "AMMPool.parameters": + if e.complexity.AMMPool.Parameters == nil { + break + } + + return e.complexity.AMMPool.Parameters(childComplexity), true + + case "AMMPool.partyID": + if e.complexity.AMMPool.PartyId == nil { + break + } + + return e.complexity.AMMPool.PartyId(childComplexity), true + + case "AMMPool.poolID": + if e.complexity.AMMPool.PoolId == nil { + break + } + + return e.complexity.AMMPool.PoolId(childComplexity), true + + case "AMMPool.status": + if e.complexity.AMMPool.Status == nil { + break + } + + return e.complexity.AMMPool.Status(childComplexity), true + + case "AMMPool.statusReason": + if e.complexity.AMMPool.StatusReason == nil { + break + } + + return e.complexity.AMMPool.StatusReason(childComplexity), true + + case "AMMPool.subAccount": + if e.complexity.AMMPool.SubAccount == nil { + break + } + + return e.complexity.AMMPool.SubAccount(childComplexity), true + + case "AMMPoolEdge.cursor": + if e.complexity.AMMPoolEdge.Cursor == nil { + break + } + + return e.complexity.AMMPoolEdge.Cursor(childComplexity), true + + case "AMMPoolEdge.node": + if e.complexity.AMMPoolEdge.Node == nil { + break + } + + return e.complexity.AMMPoolEdge.Node(childComplexity), true + + case "AMMPoolsConnection.edges": + if e.complexity.AMMPoolsConnection.Edges == nil { + break + } + + return e.complexity.AMMPoolsConnection.Edges(childComplexity), true + + case "AMMPoolsConnection.pageInfo": + if e.complexity.AMMPoolsConnection.PageInfo == nil { + break + } + + return e.complexity.AMMPoolsConnection.PageInfo(childComplexity), true + case "AbstractMarginLevels.asset": if e.complexity.AbstractMarginLevels.Asset == nil { break @@ -4922,6 +5037,41 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.CompositePriceState.PriceSources(childComplexity), true + case "ConcentratedLiquidityParameters.base": + if e.complexity.ConcentratedLiquidityParameters.Base == nil { + break + } + + return e.complexity.ConcentratedLiquidityParameters.Base(childComplexity), true + + case "ConcentratedLiquidityParameters.lowerBound": + if e.complexity.ConcentratedLiquidityParameters.LowerBound == nil { + break + } + + return e.complexity.ConcentratedLiquidityParameters.LowerBound(childComplexity), true + + case "ConcentratedLiquidityParameters.marginRatioAtLowerBound": + if e.complexity.ConcentratedLiquidityParameters.MarginRatioAtLowerBound == nil { + break + } + + return e.complexity.ConcentratedLiquidityParameters.MarginRatioAtLowerBound(childComplexity), true + + case "ConcentratedLiquidityParameters.marginRatioAtUpperBound": + if e.complexity.ConcentratedLiquidityParameters.MarginRatioAtUpperBound == nil { + break + } + + return e.complexity.ConcentratedLiquidityParameters.MarginRatioAtUpperBound(childComplexity), true + + case "ConcentratedLiquidityParameters.upperBound": + if e.complexity.ConcentratedLiquidityParameters.UpperBound == nil { + break + } + + return e.complexity.ConcentratedLiquidityParameters.UpperBound(childComplexity), true + case "Condition.operator": if e.complexity.Condition.Operator == nil { break @@ -12070,6 +12220,18 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.QuantumVolumesPerEpoch.TotalQuantumVolumes(childComplexity), true + case "Query.ammPools": + if e.complexity.Query.AmmPools == nil { + break + } + + args, err := ec.field_Query_ammPools_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.AmmPools(childComplexity, args["partyId"].(*string), args["marketId"].(*string), args["poolId"].(*string), args["subAccountId"].(*string), args["status"].(*v1.AMMPool_Status), args["pagination"].(*v2.Pagination)), true + case "Query.asset": if e.complexity.Query.Asset == nil { break @@ -17258,6 +17420,66 @@ func (ec *executionContext) field_Query___type_args(ctx context.Context, rawArgs return args, nil } +func (ec *executionContext) field_Query_ammPools_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 *string + if tmp, ok := rawArgs["partyId"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("partyId")) + arg0, err = ec.unmarshalOID2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["partyId"] = arg0 + var arg1 *string + if tmp, ok := rawArgs["marketId"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("marketId")) + arg1, err = ec.unmarshalOID2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["marketId"] = arg1 + var arg2 *string + if tmp, ok := rawArgs["poolId"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("poolId")) + arg2, err = ec.unmarshalOID2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["poolId"] = arg2 + var arg3 *string + if tmp, ok := rawArgs["subAccountId"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("subAccountId")) + arg3, err = ec.unmarshalOID2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["subAccountId"] = arg3 + var arg4 *v1.AMMPool_Status + if tmp, ok := rawArgs["status"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("status")) + arg4, err = ec.unmarshalOAMMPoolStatus2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMMPool_Status(ctx, tmp) + if err != nil { + return nil, err + } + } + args["status"] = arg4 + var arg5 *v2.Pagination + if tmp, ok := rawArgs["pagination"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("pagination")) + arg5, err = ec.unmarshalOPagination2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐPagination(ctx, tmp) + if err != nil { + return nil, err + } + } + args["pagination"] = arg5 + return args, nil +} + func (ec *executionContext) field_Query_asset_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { var err error args := map[string]interface{}{} @@ -19879,8 +20101,8 @@ func (ec *executionContext) field___Type_fields_args(ctx context.Context, rawArg // region **************************** field.gotpl ***************************** -func (ec *executionContext) _AbstractMarginLevels_market(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AbstractMarginLevels_market(ctx, field) +func (ec *executionContext) _AMMPool_partyID(ctx context.Context, field graphql.CollectedField, obj *v1.AMMPool) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMMPool_partyID(ctx, field) if err != nil { return graphql.Null } @@ -19893,7 +20115,7 @@ func (ec *executionContext) _AbstractMarginLevels_market(ctx context.Context, fi }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.Market, nil + return obj.PartyId, nil }) if err != nil { ec.Error(ctx, err) @@ -19905,90 +20127,26 @@ func (ec *executionContext) _AbstractMarginLevels_market(ctx context.Context, fi } return graphql.Null } - res := resTmp.(*vega.Market) + res := resTmp.(string) fc.Result = res - return ec.marshalNMarket2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐMarket(ctx, field.Selections, res) + return ec.marshalNID2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AbstractMarginLevels_market(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AMMPool_partyID(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMMPool", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Market_id(ctx, field) - case "fees": - return ec.fieldContext_Market_fees(ctx, field) - case "tradableInstrument": - return ec.fieldContext_Market_tradableInstrument(ctx, field) - case "decimalPlaces": - return ec.fieldContext_Market_decimalPlaces(ctx, field) - case "positionDecimalPlaces": - return ec.fieldContext_Market_positionDecimalPlaces(ctx, field) - case "openingAuction": - return ec.fieldContext_Market_openingAuction(ctx, field) - case "priceMonitoringSettings": - return ec.fieldContext_Market_priceMonitoringSettings(ctx, field) - case "liquidityMonitoringParameters": - return ec.fieldContext_Market_liquidityMonitoringParameters(ctx, field) - case "tradingMode": - return ec.fieldContext_Market_tradingMode(ctx, field) - case "state": - return ec.fieldContext_Market_state(ctx, field) - case "proposal": - return ec.fieldContext_Market_proposal(ctx, field) - case "marketProposal": - return ec.fieldContext_Market_marketProposal(ctx, field) - case "ordersConnection": - return ec.fieldContext_Market_ordersConnection(ctx, field) - case "accountsConnection": - return ec.fieldContext_Market_accountsConnection(ctx, field) - case "tradesConnection": - return ec.fieldContext_Market_tradesConnection(ctx, field) - case "depth": - return ec.fieldContext_Market_depth(ctx, field) - case "candlesConnection": - return ec.fieldContext_Market_candlesConnection(ctx, field) - case "data": - return ec.fieldContext_Market_data(ctx, field) - case "liquidityProvisions": - return ec.fieldContext_Market_liquidityProvisions(ctx, field) - case "liquidityProvisionsConnection": - return ec.fieldContext_Market_liquidityProvisionsConnection(ctx, field) - case "marketTimestamps": - return ec.fieldContext_Market_marketTimestamps(ctx, field) - case "riskFactors": - return ec.fieldContext_Market_riskFactors(ctx, field) - case "linearSlippageFactor": - return ec.fieldContext_Market_linearSlippageFactor(ctx, field) - case "quadraticSlippageFactor": - return ec.fieldContext_Market_quadraticSlippageFactor(ctx, field) - case "parentMarketID": - return ec.fieldContext_Market_parentMarketID(ctx, field) - case "insurancePoolFraction": - return ec.fieldContext_Market_insurancePoolFraction(ctx, field) - case "successorMarketID": - return ec.fieldContext_Market_successorMarketID(ctx, field) - case "liquiditySLAParameters": - return ec.fieldContext_Market_liquiditySLAParameters(ctx, field) - case "liquidationStrategy": - return ec.fieldContext_Market_liquidationStrategy(ctx, field) - case "markPriceConfiguration": - return ec.fieldContext_Market_markPriceConfiguration(ctx, field) - case "tickSize": - return ec.fieldContext_Market_tickSize(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) + return nil, errors.New("field of type ID does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AbstractMarginLevels_asset(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AbstractMarginLevels_asset(ctx, field) +func (ec *executionContext) _AMMPool_marketID(ctx context.Context, field graphql.CollectedField, obj *v1.AMMPool) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMMPool_marketID(ctx, field) if err != nil { return graphql.Null } @@ -20001,7 +20159,7 @@ func (ec *executionContext) _AbstractMarginLevels_asset(ctx context.Context, fie }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.Asset, nil + return obj.MarketId, nil }) if err != nil { ec.Error(ctx, err) @@ -20013,58 +20171,26 @@ func (ec *executionContext) _AbstractMarginLevels_asset(ctx context.Context, fie } return graphql.Null } - res := resTmp.(*vega.Asset) + res := resTmp.(string) fc.Result = res - return ec.marshalNAsset2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐAsset(ctx, field.Selections, res) + return ec.marshalNID2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AbstractMarginLevels_asset(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AMMPool_marketID(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMMPool", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Asset_id(ctx, field) - case "name": - return ec.fieldContext_Asset_name(ctx, field) - case "symbol": - return ec.fieldContext_Asset_symbol(ctx, field) - case "decimals": - return ec.fieldContext_Asset_decimals(ctx, field) - case "quantum": - return ec.fieldContext_Asset_quantum(ctx, field) - case "source": - return ec.fieldContext_Asset_source(ctx, field) - case "status": - return ec.fieldContext_Asset_status(ctx, field) - case "infrastructureFeeAccount": - return ec.fieldContext_Asset_infrastructureFeeAccount(ctx, field) - case "globalRewardPoolAccount": - return ec.fieldContext_Asset_globalRewardPoolAccount(ctx, field) - case "globalInsuranceAccount": - return ec.fieldContext_Asset_globalInsuranceAccount(ctx, field) - case "networkTreasuryAccount": - return ec.fieldContext_Asset_networkTreasuryAccount(ctx, field) - case "takerFeeRewardAccount": - return ec.fieldContext_Asset_takerFeeRewardAccount(ctx, field) - case "makerFeeRewardAccount": - return ec.fieldContext_Asset_makerFeeRewardAccount(ctx, field) - case "lpFeeRewardAccount": - return ec.fieldContext_Asset_lpFeeRewardAccount(ctx, field) - case "marketProposerRewardAccount": - return ec.fieldContext_Asset_marketProposerRewardAccount(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Asset", field.Name) + return nil, errors.New("field of type ID does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AbstractMarginLevels_maintenanceLevel(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AbstractMarginLevels_maintenanceLevel(ctx, field) +func (ec *executionContext) _AMMPool_poolID(ctx context.Context, field graphql.CollectedField, obj *v1.AMMPool) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMMPool_poolID(ctx, field) if err != nil { return graphql.Null } @@ -20077,7 +20203,7 @@ func (ec *executionContext) _AbstractMarginLevels_maintenanceLevel(ctx context.C }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.MaintenanceLevel, nil + return obj.PoolId, nil }) if err != nil { ec.Error(ctx, err) @@ -20091,24 +20217,24 @@ func (ec *executionContext) _AbstractMarginLevels_maintenanceLevel(ctx context.C } res := resTmp.(string) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalNID2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AbstractMarginLevels_maintenanceLevel(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AMMPool_poolID(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMMPool", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type ID does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AbstractMarginLevels_searchLevel(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AbstractMarginLevels_searchLevel(ctx, field) +func (ec *executionContext) _AMMPool_subAccount(ctx context.Context, field graphql.CollectedField, obj *v1.AMMPool) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMMPool_subAccount(ctx, field) if err != nil { return graphql.Null } @@ -20121,7 +20247,7 @@ func (ec *executionContext) _AbstractMarginLevels_searchLevel(ctx context.Contex }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.SearchLevel, nil + return obj.SubAccount, nil }) if err != nil { ec.Error(ctx, err) @@ -20138,9 +20264,9 @@ func (ec *executionContext) _AbstractMarginLevels_searchLevel(ctx context.Contex return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AbstractMarginLevels_searchLevel(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AMMPool_subAccount(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMMPool", Field: field, IsMethod: false, IsResolver: false, @@ -20151,8 +20277,8 @@ func (ec *executionContext) fieldContext_AbstractMarginLevels_searchLevel(ctx co return fc, nil } -func (ec *executionContext) _AbstractMarginLevels_initialLevel(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AbstractMarginLevels_initialLevel(ctx, field) +func (ec *executionContext) _AMMPool_commitment(ctx context.Context, field graphql.CollectedField, obj *v1.AMMPool) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMMPool_commitment(ctx, field) if err != nil { return graphql.Null } @@ -20165,7 +20291,7 @@ func (ec *executionContext) _AbstractMarginLevels_initialLevel(ctx context.Conte }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.InitialLevel, nil + return obj.Commitment, nil }) if err != nil { ec.Error(ctx, err) @@ -20182,9 +20308,9 @@ func (ec *executionContext) _AbstractMarginLevels_initialLevel(ctx context.Conte return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AbstractMarginLevels_initialLevel(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AMMPool_commitment(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMMPool", Field: field, IsMethod: false, IsResolver: false, @@ -20195,8 +20321,8 @@ func (ec *executionContext) fieldContext_AbstractMarginLevels_initialLevel(ctx c return fc, nil } -func (ec *executionContext) _AbstractMarginLevels_orderMarginLevel(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AbstractMarginLevels_orderMarginLevel(ctx, field) +func (ec *executionContext) _AMMPool_parameters(ctx context.Context, field graphql.CollectedField, obj *v1.AMMPool) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMMPool_parameters(ctx, field) if err != nil { return graphql.Null } @@ -20209,7 +20335,7 @@ func (ec *executionContext) _AbstractMarginLevels_orderMarginLevel(ctx context.C }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.OrderMarginLevel, nil + return obj.Parameters, nil }) if err != nil { ec.Error(ctx, err) @@ -20221,26 +20347,38 @@ func (ec *executionContext) _AbstractMarginLevels_orderMarginLevel(ctx context.C } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*v1.AMMPool_ConcentratedLiquidityParameters) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalNConcentratedLiquidityParameters2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMMPool_ConcentratedLiquidityParameters(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AbstractMarginLevels_orderMarginLevel(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AMMPool_parameters(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMMPool", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "base": + return ec.fieldContext_ConcentratedLiquidityParameters_base(ctx, field) + case "lowerBound": + return ec.fieldContext_ConcentratedLiquidityParameters_lowerBound(ctx, field) + case "upperBound": + return ec.fieldContext_ConcentratedLiquidityParameters_upperBound(ctx, field) + case "marginRatioAtUpperBound": + return ec.fieldContext_ConcentratedLiquidityParameters_marginRatioAtUpperBound(ctx, field) + case "marginRatioAtLowerBound": + return ec.fieldContext_ConcentratedLiquidityParameters_marginRatioAtLowerBound(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type ConcentratedLiquidityParameters", field.Name) }, } return fc, nil } -func (ec *executionContext) _AbstractMarginLevels_collateralReleaseLevel(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AbstractMarginLevels_collateralReleaseLevel(ctx, field) +func (ec *executionContext) _AMMPool_status(ctx context.Context, field graphql.CollectedField, obj *v1.AMMPool) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMMPool_status(ctx, field) if err != nil { return graphql.Null } @@ -20253,7 +20391,7 @@ func (ec *executionContext) _AbstractMarginLevels_collateralReleaseLevel(ctx con }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.CollateralReleaseLevel, nil + return obj.Status, nil }) if err != nil { ec.Error(ctx, err) @@ -20265,26 +20403,26 @@ func (ec *executionContext) _AbstractMarginLevels_collateralReleaseLevel(ctx con } return graphql.Null } - res := resTmp.(string) + res := resTmp.(v1.AMMPool_Status) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalNAMMPoolStatus2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMMPool_Status(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AbstractMarginLevels_collateralReleaseLevel(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AMMPool_status(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMMPool", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + return nil, errors.New("field of type AMMPoolStatus does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AbstractMarginLevels_marginMode(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AbstractMarginLevels_marginMode(ctx, field) +func (ec *executionContext) _AMMPool_statusReason(ctx context.Context, field graphql.CollectedField, obj *v1.AMMPool) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMMPool_statusReason(ctx, field) if err != nil { return graphql.Null } @@ -20297,7 +20435,7 @@ func (ec *executionContext) _AbstractMarginLevels_marginMode(ctx context.Context }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.MarginMode, nil + return obj.StatusReason, nil }) if err != nil { ec.Error(ctx, err) @@ -20309,26 +20447,26 @@ func (ec *executionContext) _AbstractMarginLevels_marginMode(ctx context.Context } return graphql.Null } - res := resTmp.(vega.MarginMode) + res := resTmp.(v1.AMMPool_StatusReason) fc.Result = res - return ec.marshalNMarginMode2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐMarginMode(ctx, field.Selections, res) + return ec.marshalNAMMPoolStatusReason2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMMPool_StatusReason(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AbstractMarginLevels_marginMode(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AMMPool_statusReason(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMMPool", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type MarginMode does not have child fields") + return nil, errors.New("field of type AMMPoolStatusReason does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AbstractMarginLevels_marginFactor(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AbstractMarginLevels_marginFactor(ctx, field) +func (ec *executionContext) _AMMPoolEdge_node(ctx context.Context, field graphql.CollectedField, obj *v2.AMMPoolEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMMPoolEdge_node(ctx, field) if err != nil { return graphql.Null } @@ -20341,7 +20479,7 @@ func (ec *executionContext) _AbstractMarginLevels_marginFactor(ctx context.Conte }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.MarginFactor, nil + return obj.Node, nil }) if err != nil { ec.Error(ctx, err) @@ -20353,26 +20491,44 @@ func (ec *executionContext) _AbstractMarginLevels_marginFactor(ctx context.Conte } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*v1.AMMPool) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalNAMMPool2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMMPool(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AbstractMarginLevels_marginFactor(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AMMPoolEdge_node(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMMPoolEdge", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") + switch field.Name { + case "partyID": + return ec.fieldContext_AMMPool_partyID(ctx, field) + case "marketID": + return ec.fieldContext_AMMPool_marketID(ctx, field) + case "poolID": + return ec.fieldContext_AMMPool_poolID(ctx, field) + case "subAccount": + return ec.fieldContext_AMMPool_subAccount(ctx, field) + case "commitment": + return ec.fieldContext_AMMPool_commitment(ctx, field) + case "parameters": + return ec.fieldContext_AMMPool_parameters(ctx, field) + case "status": + return ec.fieldContext_AMMPool_status(ctx, field) + case "statusReason": + return ec.fieldContext_AMMPool_statusReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type AMMPool", field.Name) }, } return fc, nil } -func (ec *executionContext) _AccountBalance_balance(ctx context.Context, field graphql.CollectedField, obj *v2.AccountBalance) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AccountBalance_balance(ctx, field) +func (ec *executionContext) _AMMPoolEdge_cursor(ctx context.Context, field graphql.CollectedField, obj *v2.AMMPoolEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMMPoolEdge_cursor(ctx, field) if err != nil { return graphql.Null } @@ -20385,7 +20541,7 @@ func (ec *executionContext) _AccountBalance_balance(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.Balance, nil + return obj.Cursor, nil }) if err != nil { ec.Error(ctx, err) @@ -20402,9 +20558,9 @@ func (ec *executionContext) _AccountBalance_balance(ctx context.Context, field g return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AccountBalance_balance(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AMMPoolEdge_cursor(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountBalance", + Object: "AMMPoolEdge", Field: field, IsMethod: false, IsResolver: false, @@ -20415,8 +20571,8 @@ func (ec *executionContext) fieldContext_AccountBalance_balance(ctx context.Cont return fc, nil } -func (ec *executionContext) _AccountBalance_asset(ctx context.Context, field graphql.CollectedField, obj *v2.AccountBalance) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AccountBalance_asset(ctx, field) +func (ec *executionContext) _AMMPoolsConnection_edges(ctx context.Context, field graphql.CollectedField, obj *v2.AMMPoolsConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMMPoolsConnection_edges(ctx, field) if err != nil { return graphql.Null } @@ -20429,70 +20585,41 @@ func (ec *executionContext) _AccountBalance_asset(ctx context.Context, field gra }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.AccountBalance().Asset(rctx, obj) + return obj.Edges, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(*vega.Asset) + res := resTmp.([]*v2.AMMPoolEdge) fc.Result = res - return ec.marshalNAsset2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐAsset(ctx, field.Selections, res) + return ec.marshalOAMMPoolEdge2ᚕᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAMMPoolEdge(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AccountBalance_asset(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AMMPoolsConnection_edges(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountBalance", + Object: "AMMPoolsConnection", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { - case "id": - return ec.fieldContext_Asset_id(ctx, field) - case "name": - return ec.fieldContext_Asset_name(ctx, field) - case "symbol": - return ec.fieldContext_Asset_symbol(ctx, field) - case "decimals": - return ec.fieldContext_Asset_decimals(ctx, field) - case "quantum": - return ec.fieldContext_Asset_quantum(ctx, field) - case "source": - return ec.fieldContext_Asset_source(ctx, field) - case "status": - return ec.fieldContext_Asset_status(ctx, field) - case "infrastructureFeeAccount": - return ec.fieldContext_Asset_infrastructureFeeAccount(ctx, field) - case "globalRewardPoolAccount": - return ec.fieldContext_Asset_globalRewardPoolAccount(ctx, field) - case "globalInsuranceAccount": - return ec.fieldContext_Asset_globalInsuranceAccount(ctx, field) - case "networkTreasuryAccount": - return ec.fieldContext_Asset_networkTreasuryAccount(ctx, field) - case "takerFeeRewardAccount": - return ec.fieldContext_Asset_takerFeeRewardAccount(ctx, field) - case "makerFeeRewardAccount": - return ec.fieldContext_Asset_makerFeeRewardAccount(ctx, field) - case "lpFeeRewardAccount": - return ec.fieldContext_Asset_lpFeeRewardAccount(ctx, field) - case "marketProposerRewardAccount": - return ec.fieldContext_Asset_marketProposerRewardAccount(ctx, field) + case "node": + return ec.fieldContext_AMMPoolEdge_node(ctx, field) + case "cursor": + return ec.fieldContext_AMMPoolEdge_cursor(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Asset", field.Name) + return nil, fmt.Errorf("no field named %q was found under type AMMPoolEdge", field.Name) }, } return fc, nil } -func (ec *executionContext) _AccountBalance_type(ctx context.Context, field graphql.CollectedField, obj *v2.AccountBalance) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AccountBalance_type(ctx, field) +func (ec *executionContext) _AMMPoolsConnection_pageInfo(ctx context.Context, field graphql.CollectedField, obj *v2.AMMPoolsConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMMPoolsConnection_pageInfo(ctx, field) if err != nil { return graphql.Null } @@ -20505,38 +20632,45 @@ func (ec *executionContext) _AccountBalance_type(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.Type, nil + return obj.PageInfo, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(vega.AccountType) + res := resTmp.(*v2.PageInfo) fc.Result = res - return ec.marshalNAccountType2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐAccountType(ctx, field.Selections, res) + return ec.marshalOPageInfo2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐPageInfo(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AccountBalance_type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AMMPoolsConnection_pageInfo(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountBalance", + Object: "AMMPoolsConnection", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type AccountType does not have child fields") + switch field.Name { + case "hasNextPage": + return ec.fieldContext_PageInfo_hasNextPage(ctx, field) + case "hasPreviousPage": + return ec.fieldContext_PageInfo_hasPreviousPage(ctx, field) + case "startCursor": + return ec.fieldContext_PageInfo_startCursor(ctx, field) + case "endCursor": + return ec.fieldContext_PageInfo_endCursor(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PageInfo", field.Name) }, } return fc, nil } -func (ec *executionContext) _AccountBalance_market(ctx context.Context, field graphql.CollectedField, obj *v2.AccountBalance) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AccountBalance_market(ctx, field) +func (ec *executionContext) _AbstractMarginLevels_market(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AbstractMarginLevels_market(ctx, field) if err != nil { return graphql.Null } @@ -20549,26 +20683,29 @@ func (ec *executionContext) _AccountBalance_market(ctx context.Context, field gr }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.AccountBalance().Market(rctx, obj) + return obj.Market, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } res := resTmp.(*vega.Market) fc.Result = res - return ec.marshalOMarket2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐMarket(ctx, field.Selections, res) + return ec.marshalNMarket2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐMarket(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AccountBalance_market(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AbstractMarginLevels_market(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountBalance", + Object: "AbstractMarginLevels", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { case "id": @@ -20640,8 +20777,8 @@ func (ec *executionContext) fieldContext_AccountBalance_market(ctx context.Conte return fc, nil } -func (ec *executionContext) _AccountBalance_party(ctx context.Context, field graphql.CollectedField, obj *v2.AccountBalance) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AccountBalance_party(ctx, field) +func (ec *executionContext) _AbstractMarginLevels_asset(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AbstractMarginLevels_asset(ctx, field) if err != nil { return graphql.Null } @@ -20654,77 +20791,70 @@ func (ec *executionContext) _AccountBalance_party(ctx context.Context, field gra }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.AccountBalance().Party(rctx, obj) + return obj.Asset, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*vega.Party) + res := resTmp.(*vega.Asset) fc.Result = res - return ec.marshalOParty2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐParty(ctx, field.Selections, res) + return ec.marshalNAsset2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐAsset(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AccountBalance_party(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AbstractMarginLevels_asset(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountBalance", + Object: "AbstractMarginLevels", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { case "id": - return ec.fieldContext_Party_id(ctx, field) - case "ordersConnection": - return ec.fieldContext_Party_ordersConnection(ctx, field) - case "tradesConnection": - return ec.fieldContext_Party_tradesConnection(ctx, field) - case "accountsConnection": - return ec.fieldContext_Party_accountsConnection(ctx, field) - case "positionsConnection": - return ec.fieldContext_Party_positionsConnection(ctx, field) - case "marginsConnection": - return ec.fieldContext_Party_marginsConnection(ctx, field) - case "proposalsConnection": - return ec.fieldContext_Party_proposalsConnection(ctx, field) - case "votesConnection": - return ec.fieldContext_Party_votesConnection(ctx, field) - case "withdrawalsConnection": - return ec.fieldContext_Party_withdrawalsConnection(ctx, field) - case "depositsConnection": - return ec.fieldContext_Party_depositsConnection(ctx, field) - case "liquidityProvisions": - return ec.fieldContext_Party_liquidityProvisions(ctx, field) - case "liquidityProvisionsConnection": - return ec.fieldContext_Party_liquidityProvisionsConnection(ctx, field) - case "delegationsConnection": - return ec.fieldContext_Party_delegationsConnection(ctx, field) - case "stakingSummary": - return ec.fieldContext_Party_stakingSummary(ctx, field) - case "rewardsConnection": - return ec.fieldContext_Party_rewardsConnection(ctx, field) - case "rewardSummaries": - return ec.fieldContext_Party_rewardSummaries(ctx, field) - case "transfersConnection": - return ec.fieldContext_Party_transfersConnection(ctx, field) - case "activityStreak": - return ec.fieldContext_Party_activityStreak(ctx, field) - case "vestingBalancesSummary": - return ec.fieldContext_Party_vestingBalancesSummary(ctx, field) - case "vestingStats": - return ec.fieldContext_Party_vestingStats(ctx, field) + return ec.fieldContext_Asset_id(ctx, field) + case "name": + return ec.fieldContext_Asset_name(ctx, field) + case "symbol": + return ec.fieldContext_Asset_symbol(ctx, field) + case "decimals": + return ec.fieldContext_Asset_decimals(ctx, field) + case "quantum": + return ec.fieldContext_Asset_quantum(ctx, field) + case "source": + return ec.fieldContext_Asset_source(ctx, field) + case "status": + return ec.fieldContext_Asset_status(ctx, field) + case "infrastructureFeeAccount": + return ec.fieldContext_Asset_infrastructureFeeAccount(ctx, field) + case "globalRewardPoolAccount": + return ec.fieldContext_Asset_globalRewardPoolAccount(ctx, field) + case "globalInsuranceAccount": + return ec.fieldContext_Asset_globalInsuranceAccount(ctx, field) + case "networkTreasuryAccount": + return ec.fieldContext_Asset_networkTreasuryAccount(ctx, field) + case "takerFeeRewardAccount": + return ec.fieldContext_Asset_takerFeeRewardAccount(ctx, field) + case "makerFeeRewardAccount": + return ec.fieldContext_Asset_makerFeeRewardAccount(ctx, field) + case "lpFeeRewardAccount": + return ec.fieldContext_Asset_lpFeeRewardAccount(ctx, field) + case "marketProposerRewardAccount": + return ec.fieldContext_Asset_marketProposerRewardAccount(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Party", field.Name) + return nil, fmt.Errorf("no field named %q was found under type Asset", field.Name) }, } return fc, nil } -func (ec *executionContext) _AccountDetails_assetId(ctx context.Context, field graphql.CollectedField, obj *vega.AccountDetails) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AccountDetails_assetId(ctx, field) +func (ec *executionContext) _AbstractMarginLevels_maintenanceLevel(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AbstractMarginLevels_maintenanceLevel(ctx, field) if err != nil { return graphql.Null } @@ -20737,7 +20867,7 @@ func (ec *executionContext) _AccountDetails_assetId(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.AssetId, nil + return obj.MaintenanceLevel, nil }) if err != nil { ec.Error(ctx, err) @@ -20751,24 +20881,24 @@ func (ec *executionContext) _AccountDetails_assetId(ctx context.Context, field g } res := resTmp.(string) fc.Result = res - return ec.marshalNID2string(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AccountDetails_assetId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AbstractMarginLevels_maintenanceLevel(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountDetails", + Object: "AbstractMarginLevels", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AccountDetails_type(ctx context.Context, field graphql.CollectedField, obj *vega.AccountDetails) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AccountDetails_type(ctx, field) +func (ec *executionContext) _AbstractMarginLevels_searchLevel(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AbstractMarginLevels_searchLevel(ctx, field) if err != nil { return graphql.Null } @@ -20781,7 +20911,7 @@ func (ec *executionContext) _AccountDetails_type(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.Type, nil + return obj.SearchLevel, nil }) if err != nil { ec.Error(ctx, err) @@ -20793,26 +20923,26 @@ func (ec *executionContext) _AccountDetails_type(ctx context.Context, field grap } return graphql.Null } - res := resTmp.(vega.AccountType) + res := resTmp.(string) fc.Result = res - return ec.marshalNAccountType2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐAccountType(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AccountDetails_type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AbstractMarginLevels_searchLevel(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountDetails", + Object: "AbstractMarginLevels", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type AccountType does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AccountDetails_marketId(ctx context.Context, field graphql.CollectedField, obj *vega.AccountDetails) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AccountDetails_marketId(ctx, field) +func (ec *executionContext) _AbstractMarginLevels_initialLevel(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AbstractMarginLevels_initialLevel(ctx, field) if err != nil { return graphql.Null } @@ -20825,35 +20955,38 @@ func (ec *executionContext) _AccountDetails_marketId(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.MarketId, nil + return obj.InitialLevel, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(string) fc.Result = res - return ec.marshalOID2ᚖstring(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AccountDetails_marketId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AbstractMarginLevels_initialLevel(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountDetails", + Object: "AbstractMarginLevels", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AccountDetails_partyId(ctx context.Context, field graphql.CollectedField, obj *vega.AccountDetails) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AccountDetails_partyId(ctx, field) +func (ec *executionContext) _AbstractMarginLevels_orderMarginLevel(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AbstractMarginLevels_orderMarginLevel(ctx, field) if err != nil { return graphql.Null } @@ -20866,35 +20999,38 @@ func (ec *executionContext) _AccountDetails_partyId(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.AccountDetails().PartyID(rctx, obj) + return obj.OrderMarginLevel, nil }) if err != nil { ec.Error(ctx, err) return graphql.Null } if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } return graphql.Null } - res := resTmp.(*string) + res := resTmp.(string) fc.Result = res - return ec.marshalOID2ᚖstring(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AccountDetails_partyId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AbstractMarginLevels_orderMarginLevel(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountDetails", + Object: "AbstractMarginLevels", Field: field, - IsMethod: true, - IsResolver: true, + IsMethod: false, + IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AccountEdge_node(ctx context.Context, field graphql.CollectedField, obj *v2.AccountEdge) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AccountEdge_node(ctx, field) +func (ec *executionContext) _AbstractMarginLevels_collateralReleaseLevel(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AbstractMarginLevels_collateralReleaseLevel(ctx, field) if err != nil { return graphql.Null } @@ -20907,7 +21043,7 @@ func (ec *executionContext) _AccountEdge_node(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.Node, nil + return obj.CollateralReleaseLevel, nil }) if err != nil { ec.Error(ctx, err) @@ -20919,38 +21055,26 @@ func (ec *executionContext) _AccountEdge_node(ctx context.Context, field graphql } return graphql.Null } - res := resTmp.(*v2.AccountBalance) + res := resTmp.(string) fc.Result = res - return ec.marshalNAccountBalance2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAccountBalance(ctx, field.Selections, res) + return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AccountEdge_node(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AbstractMarginLevels_collateralReleaseLevel(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountEdge", + Object: "AbstractMarginLevels", Field: field, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "balance": - return ec.fieldContext_AccountBalance_balance(ctx, field) - case "asset": - return ec.fieldContext_AccountBalance_asset(ctx, field) - case "type": - return ec.fieldContext_AccountBalance_type(ctx, field) - case "market": - return ec.fieldContext_AccountBalance_market(ctx, field) - case "party": - return ec.fieldContext_AccountBalance_party(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AccountBalance", field.Name) + return nil, errors.New("field of type String does not have child fields") }, } return fc, nil } -func (ec *executionContext) _AccountEdge_cursor(ctx context.Context, field graphql.CollectedField, obj *v2.AccountEdge) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AccountEdge_cursor(ctx, field) +func (ec *executionContext) _AbstractMarginLevels_marginMode(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AbstractMarginLevels_marginMode(ctx, field) if err != nil { return graphql.Null } @@ -20963,7 +21087,51 @@ func (ec *executionContext) _AccountEdge_cursor(ctx context.Context, field graph }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return obj.Cursor, nil + return obj.MarginMode, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(vega.MarginMode) + fc.Result = res + return ec.marshalNMarginMode2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐMarginMode(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_AbstractMarginLevels_marginMode(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "AbstractMarginLevels", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type MarginMode does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _AbstractMarginLevels_marginFactor(ctx context.Context, field graphql.CollectedField, obj *AbstractMarginLevels) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AbstractMarginLevels_marginFactor(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.MarginFactor, nil }) if err != nil { ec.Error(ctx, err) @@ -20980,9 +21148,9 @@ func (ec *executionContext) _AccountEdge_cursor(ctx context.Context, field graph return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AccountEdge_cursor(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AbstractMarginLevels_marginFactor(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountEdge", + Object: "AbstractMarginLevels", Field: field, IsMethod: false, IsResolver: false, @@ -20993,8 +21161,8 @@ func (ec *executionContext) fieldContext_AccountEdge_cursor(ctx context.Context, return fc, nil } -func (ec *executionContext) _AccountEvent_balance(ctx context.Context, field graphql.CollectedField, obj *vega.Account) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AccountEvent_balance(ctx, field) +func (ec *executionContext) _AccountBalance_balance(ctx context.Context, field graphql.CollectedField, obj *v2.AccountBalance) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AccountBalance_balance(ctx, field) if err != nil { return graphql.Null } @@ -21024,9 +21192,9 @@ func (ec *executionContext) _AccountEvent_balance(ctx context.Context, field gra return ec.marshalNString2string(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AccountEvent_balance(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AccountBalance_balance(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountEvent", + Object: "AccountBalance", Field: field, IsMethod: false, IsResolver: false, @@ -21037,8 +21205,8 @@ func (ec *executionContext) fieldContext_AccountEvent_balance(ctx context.Contex return fc, nil } -func (ec *executionContext) _AccountEvent_asset(ctx context.Context, field graphql.CollectedField, obj *vega.Account) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AccountEvent_asset(ctx, field) +func (ec *executionContext) _AccountBalance_asset(ctx context.Context, field graphql.CollectedField, obj *v2.AccountBalance) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AccountBalance_asset(ctx, field) if err != nil { return graphql.Null } @@ -21051,7 +21219,7 @@ func (ec *executionContext) _AccountEvent_asset(ctx context.Context, field graph }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.AccountEvent().Asset(rctx, obj) + return ec.resolvers.AccountBalance().Asset(rctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -21068,9 +21236,9 @@ func (ec *executionContext) _AccountEvent_asset(ctx context.Context, field graph return ec.marshalNAsset2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐAsset(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AccountEvent_asset(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AccountBalance_asset(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountEvent", + Object: "AccountBalance", Field: field, IsMethod: true, IsResolver: true, @@ -21113,8 +21281,8 @@ func (ec *executionContext) fieldContext_AccountEvent_asset(ctx context.Context, return fc, nil } -func (ec *executionContext) _AccountEvent_type(ctx context.Context, field graphql.CollectedField, obj *vega.Account) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AccountEvent_type(ctx, field) +func (ec *executionContext) _AccountBalance_type(ctx context.Context, field graphql.CollectedField, obj *v2.AccountBalance) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AccountBalance_type(ctx, field) if err != nil { return graphql.Null } @@ -21144,9 +21312,9 @@ func (ec *executionContext) _AccountEvent_type(ctx context.Context, field graphq return ec.marshalNAccountType2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐAccountType(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AccountEvent_type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AccountBalance_type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountEvent", + Object: "AccountBalance", Field: field, IsMethod: false, IsResolver: false, @@ -21157,8 +21325,8 @@ func (ec *executionContext) fieldContext_AccountEvent_type(ctx context.Context, return fc, nil } -func (ec *executionContext) _AccountEvent_market(ctx context.Context, field graphql.CollectedField, obj *vega.Account) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AccountEvent_market(ctx, field) +func (ec *executionContext) _AccountBalance_market(ctx context.Context, field graphql.CollectedField, obj *v2.AccountBalance) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AccountBalance_market(ctx, field) if err != nil { return graphql.Null } @@ -21171,7 +21339,7 @@ func (ec *executionContext) _AccountEvent_market(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.AccountEvent().Market(rctx, obj) + return ec.resolvers.AccountBalance().Market(rctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -21185,9 +21353,631 @@ func (ec *executionContext) _AccountEvent_market(ctx context.Context, field grap return ec.marshalOMarket2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐMarket(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_AccountEvent_market(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AccountBalance_market(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountEvent", + Object: "AccountBalance", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Market_id(ctx, field) + case "fees": + return ec.fieldContext_Market_fees(ctx, field) + case "tradableInstrument": + return ec.fieldContext_Market_tradableInstrument(ctx, field) + case "decimalPlaces": + return ec.fieldContext_Market_decimalPlaces(ctx, field) + case "positionDecimalPlaces": + return ec.fieldContext_Market_positionDecimalPlaces(ctx, field) + case "openingAuction": + return ec.fieldContext_Market_openingAuction(ctx, field) + case "priceMonitoringSettings": + return ec.fieldContext_Market_priceMonitoringSettings(ctx, field) + case "liquidityMonitoringParameters": + return ec.fieldContext_Market_liquidityMonitoringParameters(ctx, field) + case "tradingMode": + return ec.fieldContext_Market_tradingMode(ctx, field) + case "state": + return ec.fieldContext_Market_state(ctx, field) + case "proposal": + return ec.fieldContext_Market_proposal(ctx, field) + case "marketProposal": + return ec.fieldContext_Market_marketProposal(ctx, field) + case "ordersConnection": + return ec.fieldContext_Market_ordersConnection(ctx, field) + case "accountsConnection": + return ec.fieldContext_Market_accountsConnection(ctx, field) + case "tradesConnection": + return ec.fieldContext_Market_tradesConnection(ctx, field) + case "depth": + return ec.fieldContext_Market_depth(ctx, field) + case "candlesConnection": + return ec.fieldContext_Market_candlesConnection(ctx, field) + case "data": + return ec.fieldContext_Market_data(ctx, field) + case "liquidityProvisions": + return ec.fieldContext_Market_liquidityProvisions(ctx, field) + case "liquidityProvisionsConnection": + return ec.fieldContext_Market_liquidityProvisionsConnection(ctx, field) + case "marketTimestamps": + return ec.fieldContext_Market_marketTimestamps(ctx, field) + case "riskFactors": + return ec.fieldContext_Market_riskFactors(ctx, field) + case "linearSlippageFactor": + return ec.fieldContext_Market_linearSlippageFactor(ctx, field) + case "quadraticSlippageFactor": + return ec.fieldContext_Market_quadraticSlippageFactor(ctx, field) + case "parentMarketID": + return ec.fieldContext_Market_parentMarketID(ctx, field) + case "insurancePoolFraction": + return ec.fieldContext_Market_insurancePoolFraction(ctx, field) + case "successorMarketID": + return ec.fieldContext_Market_successorMarketID(ctx, field) + case "liquiditySLAParameters": + return ec.fieldContext_Market_liquiditySLAParameters(ctx, field) + case "liquidationStrategy": + return ec.fieldContext_Market_liquidationStrategy(ctx, field) + case "markPriceConfiguration": + return ec.fieldContext_Market_markPriceConfiguration(ctx, field) + case "tickSize": + return ec.fieldContext_Market_tickSize(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _AccountBalance_party(ctx context.Context, field graphql.CollectedField, obj *v2.AccountBalance) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AccountBalance_party(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.AccountBalance().Party(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*vega.Party) + fc.Result = res + return ec.marshalOParty2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐParty(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_AccountBalance_party(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "AccountBalance", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Party_id(ctx, field) + case "ordersConnection": + return ec.fieldContext_Party_ordersConnection(ctx, field) + case "tradesConnection": + return ec.fieldContext_Party_tradesConnection(ctx, field) + case "accountsConnection": + return ec.fieldContext_Party_accountsConnection(ctx, field) + case "positionsConnection": + return ec.fieldContext_Party_positionsConnection(ctx, field) + case "marginsConnection": + return ec.fieldContext_Party_marginsConnection(ctx, field) + case "proposalsConnection": + return ec.fieldContext_Party_proposalsConnection(ctx, field) + case "votesConnection": + return ec.fieldContext_Party_votesConnection(ctx, field) + case "withdrawalsConnection": + return ec.fieldContext_Party_withdrawalsConnection(ctx, field) + case "depositsConnection": + return ec.fieldContext_Party_depositsConnection(ctx, field) + case "liquidityProvisions": + return ec.fieldContext_Party_liquidityProvisions(ctx, field) + case "liquidityProvisionsConnection": + return ec.fieldContext_Party_liquidityProvisionsConnection(ctx, field) + case "delegationsConnection": + return ec.fieldContext_Party_delegationsConnection(ctx, field) + case "stakingSummary": + return ec.fieldContext_Party_stakingSummary(ctx, field) + case "rewardsConnection": + return ec.fieldContext_Party_rewardsConnection(ctx, field) + case "rewardSummaries": + return ec.fieldContext_Party_rewardSummaries(ctx, field) + case "transfersConnection": + return ec.fieldContext_Party_transfersConnection(ctx, field) + case "activityStreak": + return ec.fieldContext_Party_activityStreak(ctx, field) + case "vestingBalancesSummary": + return ec.fieldContext_Party_vestingBalancesSummary(ctx, field) + case "vestingStats": + return ec.fieldContext_Party_vestingStats(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Party", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _AccountDetails_assetId(ctx context.Context, field graphql.CollectedField, obj *vega.AccountDetails) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AccountDetails_assetId(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.AssetId, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNID2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_AccountDetails_assetId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "AccountDetails", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type ID does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _AccountDetails_type(ctx context.Context, field graphql.CollectedField, obj *vega.AccountDetails) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AccountDetails_type(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(vega.AccountType) + fc.Result = res + return ec.marshalNAccountType2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐAccountType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_AccountDetails_type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "AccountDetails", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type AccountType does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _AccountDetails_marketId(ctx context.Context, field graphql.CollectedField, obj *vega.AccountDetails) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AccountDetails_marketId(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.MarketId, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOID2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_AccountDetails_marketId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "AccountDetails", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type ID does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _AccountDetails_partyId(ctx context.Context, field graphql.CollectedField, obj *vega.AccountDetails) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AccountDetails_partyId(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.AccountDetails().PartyID(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOID2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_AccountDetails_partyId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "AccountDetails", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type ID does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _AccountEdge_node(ctx context.Context, field graphql.CollectedField, obj *v2.AccountEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AccountEdge_node(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Node, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*v2.AccountBalance) + fc.Result = res + return ec.marshalNAccountBalance2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAccountBalance(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_AccountEdge_node(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "AccountEdge", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "balance": + return ec.fieldContext_AccountBalance_balance(ctx, field) + case "asset": + return ec.fieldContext_AccountBalance_asset(ctx, field) + case "type": + return ec.fieldContext_AccountBalance_type(ctx, field) + case "market": + return ec.fieldContext_AccountBalance_market(ctx, field) + case "party": + return ec.fieldContext_AccountBalance_party(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type AccountBalance", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _AccountEdge_cursor(ctx context.Context, field graphql.CollectedField, obj *v2.AccountEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AccountEdge_cursor(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Cursor, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_AccountEdge_cursor(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "AccountEdge", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _AccountEvent_balance(ctx context.Context, field graphql.CollectedField, obj *vega.Account) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AccountEvent_balance(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Balance, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_AccountEvent_balance(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "AccountEvent", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _AccountEvent_asset(ctx context.Context, field graphql.CollectedField, obj *vega.Account) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AccountEvent_asset(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.AccountEvent().Asset(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*vega.Asset) + fc.Result = res + return ec.marshalNAsset2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐAsset(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_AccountEvent_asset(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "AccountEvent", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Asset_id(ctx, field) + case "name": + return ec.fieldContext_Asset_name(ctx, field) + case "symbol": + return ec.fieldContext_Asset_symbol(ctx, field) + case "decimals": + return ec.fieldContext_Asset_decimals(ctx, field) + case "quantum": + return ec.fieldContext_Asset_quantum(ctx, field) + case "source": + return ec.fieldContext_Asset_source(ctx, field) + case "status": + return ec.fieldContext_Asset_status(ctx, field) + case "infrastructureFeeAccount": + return ec.fieldContext_Asset_infrastructureFeeAccount(ctx, field) + case "globalRewardPoolAccount": + return ec.fieldContext_Asset_globalRewardPoolAccount(ctx, field) + case "globalInsuranceAccount": + return ec.fieldContext_Asset_globalInsuranceAccount(ctx, field) + case "networkTreasuryAccount": + return ec.fieldContext_Asset_networkTreasuryAccount(ctx, field) + case "takerFeeRewardAccount": + return ec.fieldContext_Asset_takerFeeRewardAccount(ctx, field) + case "makerFeeRewardAccount": + return ec.fieldContext_Asset_makerFeeRewardAccount(ctx, field) + case "lpFeeRewardAccount": + return ec.fieldContext_Asset_lpFeeRewardAccount(ctx, field) + case "marketProposerRewardAccount": + return ec.fieldContext_Asset_marketProposerRewardAccount(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Asset", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _AccountEvent_type(ctx context.Context, field graphql.CollectedField, obj *vega.Account) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AccountEvent_type(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(vega.AccountType) + fc.Result = res + return ec.marshalNAccountType2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐAccountType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_AccountEvent_type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "AccountEvent", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type AccountType does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _AccountEvent_market(ctx context.Context, field graphql.CollectedField, obj *vega.Account) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AccountEvent_market(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.AccountEvent().Market(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*vega.Market) + fc.Result = res + return ec.marshalOMarket2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐMarket(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_AccountEvent_market(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "AccountEvent", Field: field, IsMethod: true, IsResolver: true, @@ -26801,6 +27591,226 @@ func (ec *executionContext) fieldContext_CompositePriceState_priceSources(ctx co return fc, nil } +func (ec *executionContext) _ConcentratedLiquidityParameters_base(ctx context.Context, field graphql.CollectedField, obj *v1.AMMPool_ConcentratedLiquidityParameters) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ConcentratedLiquidityParameters_base(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Base, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_ConcentratedLiquidityParameters_base(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "ConcentratedLiquidityParameters", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _ConcentratedLiquidityParameters_lowerBound(ctx context.Context, field graphql.CollectedField, obj *v1.AMMPool_ConcentratedLiquidityParameters) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ConcentratedLiquidityParameters_lowerBound(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.LowerBound, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_ConcentratedLiquidityParameters_lowerBound(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "ConcentratedLiquidityParameters", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _ConcentratedLiquidityParameters_upperBound(ctx context.Context, field graphql.CollectedField, obj *v1.AMMPool_ConcentratedLiquidityParameters) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ConcentratedLiquidityParameters_upperBound(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.UpperBound, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_ConcentratedLiquidityParameters_upperBound(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "ConcentratedLiquidityParameters", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _ConcentratedLiquidityParameters_marginRatioAtUpperBound(ctx context.Context, field graphql.CollectedField, obj *v1.AMMPool_ConcentratedLiquidityParameters) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ConcentratedLiquidityParameters_marginRatioAtUpperBound(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.MarginRatioAtUpperBound, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_ConcentratedLiquidityParameters_marginRatioAtUpperBound(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "ConcentratedLiquidityParameters", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _ConcentratedLiquidityParameters_marginRatioAtLowerBound(ctx context.Context, field graphql.CollectedField, obj *v1.AMMPool_ConcentratedLiquidityParameters) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ConcentratedLiquidityParameters_marginRatioAtLowerBound(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.MarginRatioAtLowerBound, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_ConcentratedLiquidityParameters_marginRatioAtLowerBound(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "ConcentratedLiquidityParameters", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _Condition_operator(ctx context.Context, field graphql.CollectedField, obj *Condition) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Condition_operator(ctx, field) if err != nil { @@ -74864,6 +75874,67 @@ func (ec *executionContext) fieldContext_QuantumVolumesPerEpoch_totalQuantumVolu return fc, nil } +func (ec *executionContext) _Query_ammPools(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_ammPools(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().AmmPools(rctx, fc.Args["partyId"].(*string), fc.Args["marketId"].(*string), fc.Args["poolId"].(*string), fc.Args["subAccountId"].(*string), fc.Args["status"].(*v1.AMMPool_Status), fc.Args["pagination"].(*v2.Pagination)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*v2.AMMPoolsConnection) + fc.Result = res + return ec.marshalNAMMPoolsConnection2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAMMPoolsConnection(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_ammPools(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "edges": + return ec.fieldContext_AMMPoolsConnection_edges(ctx, field) + case "pageInfo": + return ec.fieldContext_AMMPoolsConnection_pageInfo(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type AMMPoolsConnection", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query_ammPools_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + func (ec *executionContext) _Query_asset(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Query_asset(ctx, field) if err != nil { @@ -105350,6 +106421,162 @@ func (ec *executionContext) _WithdrawalDetails(ctx context.Context, sel ast.Sele // region **************************** object.gotpl **************************** +var aMMPoolImplementors = []string{"AMMPool"} + +func (ec *executionContext) _AMMPool(ctx context.Context, sel ast.SelectionSet, obj *v1.AMMPool) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, aMMPoolImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("AMMPool") + case "partyID": + out.Values[i] = ec._AMMPool_partyID(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "marketID": + out.Values[i] = ec._AMMPool_marketID(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "poolID": + out.Values[i] = ec._AMMPool_poolID(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "subAccount": + out.Values[i] = ec._AMMPool_subAccount(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "commitment": + out.Values[i] = ec._AMMPool_commitment(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "parameters": + out.Values[i] = ec._AMMPool_parameters(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "status": + out.Values[i] = ec._AMMPool_status(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "statusReason": + out.Values[i] = ec._AMMPool_statusReason(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var aMMPoolEdgeImplementors = []string{"AMMPoolEdge"} + +func (ec *executionContext) _AMMPoolEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.AMMPoolEdge) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, aMMPoolEdgeImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("AMMPoolEdge") + case "node": + out.Values[i] = ec._AMMPoolEdge_node(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "cursor": + out.Values[i] = ec._AMMPoolEdge_cursor(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var aMMPoolsConnectionImplementors = []string{"AMMPoolsConnection"} + +func (ec *executionContext) _AMMPoolsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.AMMPoolsConnection) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, aMMPoolsConnectionImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("AMMPoolsConnection") + case "edges": + out.Values[i] = ec._AMMPoolsConnection_edges(ctx, field, obj) + case "pageInfo": + out.Values[i] = ec._AMMPoolsConnection_pageInfo(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + var abstractMarginLevelsImplementors = []string{"AbstractMarginLevels"} func (ec *executionContext) _AbstractMarginLevels(ctx context.Context, sel ast.SelectionSet, obj *AbstractMarginLevels) graphql.Marshaler { @@ -108193,6 +109420,65 @@ func (ec *executionContext) _CompositePriceState(ctx context.Context, sel ast.Se return out } +var concentratedLiquidityParametersImplementors = []string{"ConcentratedLiquidityParameters"} + +func (ec *executionContext) _ConcentratedLiquidityParameters(ctx context.Context, sel ast.SelectionSet, obj *v1.AMMPool_ConcentratedLiquidityParameters) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, concentratedLiquidityParametersImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("ConcentratedLiquidityParameters") + case "base": + out.Values[i] = ec._ConcentratedLiquidityParameters_base(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "lowerBound": + out.Values[i] = ec._ConcentratedLiquidityParameters_lowerBound(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "upperBound": + out.Values[i] = ec._ConcentratedLiquidityParameters_upperBound(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "marginRatioAtUpperBound": + out.Values[i] = ec._ConcentratedLiquidityParameters_marginRatioAtUpperBound(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "marginRatioAtLowerBound": + out.Values[i] = ec._ConcentratedLiquidityParameters_marginRatioAtLowerBound(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + var conditionImplementors = []string{"Condition"} func (ec *executionContext) _Condition(ctx context.Context, sel ast.SelectionSet, obj *Condition) graphql.Marshaler { @@ -128634,93 +129920,176 @@ func (ec *executionContext) _PubKey(ctx context.Context, sel ast.SelectionSet, o return out } -var quantumRewardsPerEpochImplementors = []string{"QuantumRewardsPerEpoch"} +var quantumRewardsPerEpochImplementors = []string{"QuantumRewardsPerEpoch"} + +func (ec *executionContext) _QuantumRewardsPerEpoch(ctx context.Context, sel ast.SelectionSet, obj *v2.QuantumRewardsPerEpoch) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, quantumRewardsPerEpochImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("QuantumRewardsPerEpoch") + case "epoch": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._QuantumRewardsPerEpoch_epoch(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "totalQuantumRewards": + out.Values[i] = ec._QuantumRewardsPerEpoch_totalQuantumRewards(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var quantumVolumesPerEpochImplementors = []string{"QuantumVolumesPerEpoch"} + +func (ec *executionContext) _QuantumVolumesPerEpoch(ctx context.Context, sel ast.SelectionSet, obj *v2.QuantumVolumesPerEpoch) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, quantumVolumesPerEpochImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("QuantumVolumesPerEpoch") + case "epoch": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._QuantumVolumesPerEpoch_epoch(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "totalQuantumVolumes": + out.Values[i] = ec._QuantumVolumesPerEpoch_totalQuantumVolumes(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var queryImplementors = []string{"Query"} -func (ec *executionContext) _QuantumRewardsPerEpoch(ctx context.Context, sel ast.SelectionSet, obj *v2.QuantumRewardsPerEpoch) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, quantumRewardsPerEpochImplementors) +func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, queryImplementors) + ctx = graphql.WithFieldContext(ctx, &graphql.FieldContext{ + Object: "Query", + }) out := graphql.NewFieldSet(fields) deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("QuantumRewardsPerEpoch") - case "epoch": - field := field - - innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - } - }() - res = ec._QuantumRewardsPerEpoch_epoch(ctx, field, obj) - if res == graphql.Null { - atomic.AddUint32(&fs.Invalids, 1) - } - return res - } - - if field.Deferrable != nil { - dfs, ok := deferred[field.Deferrable.Label] - di := 0 - if ok { - dfs.AddField(field) - di = len(dfs.Values) - 1 - } else { - dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) - deferred[field.Deferrable.Label] = dfs - } - dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { - return innerFunc(ctx, dfs) - }) - - // don't run the out.Concurrently() call below - out.Values[i] = graphql.Null - continue - } - - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - case "totalQuantumRewards": - out.Values[i] = ec._QuantumRewardsPerEpoch_totalQuantumRewards(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&out.Invalids, 1) - } - default: - panic("unknown field " + strconv.Quote(field.Name)) - } - } - out.Dispatch(ctx) - if out.Invalids > 0 { - return graphql.Null - } - - atomic.AddInt32(&ec.deferred, int32(len(deferred))) - - for label, dfs := range deferred { - ec.processDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, + innerCtx := graphql.WithRootFieldContext(ctx, &graphql.RootFieldContext{ + Object: field.Name, + Field: field, }) - } - return out -} - -var quantumVolumesPerEpochImplementors = []string{"QuantumVolumesPerEpoch"} - -func (ec *executionContext) _QuantumVolumesPerEpoch(ctx context.Context, sel ast.SelectionSet, obj *v2.QuantumVolumesPerEpoch) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, quantumVolumesPerEpochImplementors) - - out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) - for i, field := range fields { switch field.Name { case "__typename": - out.Values[i] = graphql.MarshalString("QuantumVolumesPerEpoch") - case "epoch": + out.Values[i] = graphql.MarshalString("Query") + case "ammPools": field := field innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { @@ -128729,80 +130098,19 @@ func (ec *executionContext) _QuantumVolumesPerEpoch(ctx context.Context, sel ast ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._QuantumVolumesPerEpoch_epoch(ctx, field, obj) + res = ec._Query_ammPools(ctx, field) if res == graphql.Null { atomic.AddUint32(&fs.Invalids, 1) } return res } - if field.Deferrable != nil { - dfs, ok := deferred[field.Deferrable.Label] - di := 0 - if ok { - dfs.AddField(field) - di = len(dfs.Values) - 1 - } else { - dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) - deferred[field.Deferrable.Label] = dfs - } - dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { - return innerFunc(ctx, dfs) - }) - - // don't run the out.Concurrently() call below - out.Values[i] = graphql.Null - continue - } - - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - case "totalQuantumVolumes": - out.Values[i] = ec._QuantumVolumesPerEpoch_totalQuantumVolumes(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&out.Invalids, 1) + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - default: - panic("unknown field " + strconv.Quote(field.Name)) - } - } - out.Dispatch(ctx) - if out.Invalids > 0 { - return graphql.Null - } - - atomic.AddInt32(&ec.deferred, int32(len(deferred))) - - for label, dfs := range deferred { - ec.processDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } - - return out -} - -var queryImplementors = []string{"Query"} -func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, queryImplementors) - ctx = graphql.WithFieldContext(ctx, &graphql.FieldContext{ - Object: "Query", - }) - - out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) - for i, field := range fields { - innerCtx := graphql.WithRootFieldContext(ctx, &graphql.RootFieldContext{ - Object: field.Name, - Field: field, - }) - - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("Query") + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "asset": field := field @@ -140542,6 +141850,60 @@ func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, o // region ***************************** type.gotpl ***************************** +func (ec *executionContext) marshalNAMMPool2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMMPool(ctx context.Context, sel ast.SelectionSet, v *v1.AMMPool) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._AMMPool(ctx, sel, v) +} + +func (ec *executionContext) unmarshalNAMMPoolStatus2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMMPool_Status(ctx context.Context, v interface{}) (v1.AMMPool_Status, error) { + res, err := marshallers.UnmarshalAMMPoolStatus(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalNAMMPoolStatus2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMMPool_Status(ctx context.Context, sel ast.SelectionSet, v v1.AMMPool_Status) graphql.Marshaler { + res := marshallers.MarshalAMMPoolStatus(v) + if res == graphql.Null { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + } + return res +} + +func (ec *executionContext) unmarshalNAMMPoolStatusReason2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMMPool_StatusReason(ctx context.Context, v interface{}) (v1.AMMPool_StatusReason, error) { + res, err := marshallers.UnmarshalAMMPoolStatusReason(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalNAMMPoolStatusReason2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMMPool_StatusReason(ctx context.Context, sel ast.SelectionSet, v v1.AMMPool_StatusReason) graphql.Marshaler { + res := marshallers.MarshalAMMPoolStatusReason(v) + if res == graphql.Null { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + } + return res +} + +func (ec *executionContext) marshalNAMMPoolsConnection2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAMMPoolsConnection(ctx context.Context, sel ast.SelectionSet, v v2.AMMPoolsConnection) graphql.Marshaler { + return ec._AMMPoolsConnection(ctx, sel, &v) +} + +func (ec *executionContext) marshalNAMMPoolsConnection2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAMMPoolsConnection(ctx context.Context, sel ast.SelectionSet, v *v2.AMMPoolsConnection) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._AMMPoolsConnection(ctx, sel, v) +} + func (ec *executionContext) marshalNAbstractMarginLevels2codeᚗvegaprotocolᚗioᚋvegaᚋdatanodeᚋgatewayᚋgraphqlᚐAbstractMarginLevels(ctx context.Context, sel ast.SelectionSet, v AbstractMarginLevels) graphql.Marshaler { return ec._AbstractMarginLevels(ctx, sel, &v) } @@ -141087,6 +142449,16 @@ func (ec *executionContext) marshalNCompositePriceType2codeᚗvegaprotocolᚗio return v } +func (ec *executionContext) marshalNConcentratedLiquidityParameters2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMMPool_ConcentratedLiquidityParameters(ctx context.Context, sel ast.SelectionSet, v *v1.AMMPool_ConcentratedLiquidityParameters) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._ConcentratedLiquidityParameters(ctx, sel, v) +} + func (ec *executionContext) marshalNCondition2ᚕᚖcodeᚗvegaprotocolᚗioᚋvegaᚋdatanodeᚋgatewayᚋgraphqlᚐCondition(ctx context.Context, sel ast.SelectionSet, v []*Condition) graphql.Marshaler { ret := make(graphql.Array, len(v)) var wg sync.WaitGroup @@ -145907,6 +147279,70 @@ func (ec *executionContext) marshalN__TypeKind2string(ctx context.Context, sel a return res } +func (ec *executionContext) marshalOAMMPoolEdge2ᚕᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAMMPoolEdge(ctx context.Context, sel ast.SelectionSet, v []*v2.AMMPoolEdge) graphql.Marshaler { + if v == nil { + return graphql.Null + } + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalOAMMPoolEdge2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAMMPoolEdge(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + return ret +} + +func (ec *executionContext) marshalOAMMPoolEdge2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAMMPoolEdge(ctx context.Context, sel ast.SelectionSet, v *v2.AMMPoolEdge) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._AMMPoolEdge(ctx, sel, v) +} + +func (ec *executionContext) unmarshalOAMMPoolStatus2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMMPool_Status(ctx context.Context, v interface{}) (*v1.AMMPool_Status, error) { + if v == nil { + return nil, nil + } + res, err := marshallers.UnmarshalAMMPoolStatus(v) + return &res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalOAMMPoolStatus2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMMPool_Status(ctx context.Context, sel ast.SelectionSet, v *v1.AMMPool_Status) graphql.Marshaler { + if v == nil { + return graphql.Null + } + res := marshallers.MarshalAMMPoolStatus(*v) + return res +} + func (ec *executionContext) marshalOAccountBalance2ᚕᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAccountBalance(ctx context.Context, sel ast.SelectionSet, v []*v2.AccountBalance) graphql.Marshaler { if v == nil { return graphql.Null diff --git a/datanode/gateway/graphql/gqlgen.yml b/datanode/gateway/graphql/gqlgen.yml index e3ed3ebb8f3..e19b20102c5 100644 --- a/datanode/gateway/graphql/gqlgen.yml +++ b/datanode/gateway/graphql/gqlgen.yml @@ -803,3 +803,15 @@ models: model: code.vegaprotocol.io/vega/protos/vega.VoteELSPair TimeWeightedNotionalPosition: model: code.vegaprotocol.io/vega/protos/data-node/api/v2.TimeWeightedNotionalPosition + AMMPoolStatus: + model: code.vegaprotocol.io/vega/datanode/gateway/graphql/marshallers.AMMPoolStatus + AMMPoolStatusReason: + model: code.vegaprotocol.io/vega/datanode/gateway/graphql/marshallers.AMMPoolStatusReason + ConcentratedLiquidityParameters: + model: code.vegaprotocol.io/vega/protos/vega/events/v1.AMMPool_ConcentratedLiquidityParameters + AMMPool: + model: code.vegaprotocol.io/vega/protos/vega/events/v1.AMMPool + AMMPoolEdge: + model: code.vegaprotocol.io/vega/protos/data-node/api/v2.AMMPoolEdge + AMMPoolsConnection: + model: code.vegaprotocol.io/vega/protos/data-node/api/v2.AMMPoolsConnection diff --git a/datanode/gateway/graphql/marshallers/marshallers.go b/datanode/gateway/graphql/marshallers/marshallers.go index 38f7b022b65..2c2580c5315 100644 --- a/datanode/gateway/graphql/marshallers/marshallers.go +++ b/datanode/gateway/graphql/marshallers/marshallers.go @@ -710,3 +710,43 @@ func UnmarshalMarginMode(v interface{}) (vega.MarginMode, error) { return vega.MarginMode(side), nil } + +func MarshalAMMPoolStatus(s eventspb.AMMPool_Status) graphql.Marshaler { + return graphql.WriterFunc(func(w io.Writer) { + w.Write([]byte(strconv.Quote(s.String()))) + }) +} + +func UnmarshalAMMPoolStatus(v interface{}) (eventspb.AMMPool_Status, error) { + s, ok := v.(string) + if !ok { + return eventspb.AMMPool_STATUS_UNSPECIFIED, fmt.Errorf("expected AMM pool status to be a string") + } + + status, ok := eventspb.AMMPool_Status_value[s] + if !ok { + return eventspb.AMMPool_STATUS_UNSPECIFIED, fmt.Errorf("failed to convert AMM pool status from GraphQL to Proto: %v", s) + } + + return eventspb.AMMPool_Status(status), nil +} + +func MarshalAMMPoolStatusReason(s eventspb.AMMPool_StatusReason) graphql.Marshaler { + return graphql.WriterFunc(func(w io.Writer) { + w.Write([]byte(strconv.Quote(s.String()))) + }) +} + +func UnmarshalAMMPoolStatusReason(v interface{}) (eventspb.AMMPool_StatusReason, error) { + s, ok := v.(string) + if !ok { + return eventspb.AMMPool_STATUS_REASON_UNSPECIFIED, fmt.Errorf("expected AMM pool status reason to be a string") + } + + status, ok := eventspb.AMMPool_StatusReason_value[s] + if !ok { + return eventspb.AMMPool_STATUS_REASON_UNSPECIFIED, fmt.Errorf("failed to convert AMM pool status reason from GraphQL to Proto: %v", s) + } + + return eventspb.AMMPool_StatusReason(status), nil +} diff --git a/datanode/gateway/graphql/mocks/mocks.go b/datanode/gateway/graphql/mocks/mocks.go index cb30455b6cd..ea470b620fd 100644 --- a/datanode/gateway/graphql/mocks/mocks.go +++ b/datanode/gateway/graphql/mocks/mocks.go @@ -1220,6 +1220,26 @@ func (mr *MockTradingDataServiceClientV2MockRecorder) Info(arg0, arg1 interface{ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Info", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).Info), varargs...) } +// ListAMMPools mocks base method. +func (m *MockTradingDataServiceClientV2) ListAMMPools(arg0 context.Context, arg1 *v2.ListAMMPoolsRequest, arg2 ...grpc.CallOption) (*v2.ListAMMPoolsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListAMMPools", varargs...) + ret0, _ := ret[0].(*v2.ListAMMPoolsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListAMMPools indicates an expected call of ListAMMPools. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListAMMPools(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAMMPools", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListAMMPools), varargs...) +} + // ListAccounts mocks base method. func (m *MockTradingDataServiceClientV2) ListAccounts(arg0 context.Context, arg1 *v2.ListAccountsRequest, arg2 ...grpc.CallOption) (*v2.ListAccountsResponse, error) { m.ctrl.T.Helper() diff --git a/datanode/gateway/graphql/resolvers.go b/datanode/gateway/graphql/resolvers.go index 3cca2cdee94..2ae8c8d3416 100644 --- a/datanode/gateway/graphql/resolvers.go +++ b/datanode/gateway/graphql/resolvers.go @@ -796,6 +796,25 @@ func (r *myQueryResolver) TimeWeightedNotionalPosition(ctx context.Context, asse return res.TimeWeightedNotionalPosition, nil } +func (r *myQueryResolver) AmmPools(ctx context.Context, partyID *string, marketID *string, poolID *string, + subAccount *string, status *v1.AMMPool_Status, pagination *v2.Pagination, +) (*v2.AMMPoolsConnection, error) { + req := &v2.ListAMMPoolsRequest{ + PartyId: partyID, + MarketId: marketID, + PoolId: poolID, + SubAccount: subAccount, + Status: status, + Pagination: pagination, + } + + res, err := r.tradingDataClientV2.ListAMMPools(ctx, req) + if err != nil { + return nil, err + } + return res.AmmPools, nil +} + func (r *myQueryResolver) PartiesProfilesConnection(ctx context.Context, ids []string, pagination *v2.Pagination) (*v2.PartiesProfilesConnection, error) { req := v2.ListPartiesProfilesRequest{ Parties: ids, diff --git a/datanode/gateway/graphql/schema.graphql b/datanode/gateway/graphql/schema.graphql index 15c956698d0..04d073e7280 100644 --- a/datanode/gateway/graphql/schema.graphql +++ b/datanode/gateway/graphql/schema.graphql @@ -583,6 +583,24 @@ input RewardSummaryFilter { "Queries allow a caller to read data and filter data via GraphQL." type Query { + ammPools( + "Party ID to filter for. If provided any other filters will be ignored." + partyId: ID + "Market ID to filter for. Must be provided as the only filter if used." + marketId: ID + "Pool ID to filter for. Party ID and Market ID filters must not be set if used." + poolId: ID + """ + Party's underlying AMM sub-account to filter for. A party will only ever have one AMM sub-account regardless of how many AMM pools they have created. + This filter is ignored if party ID, market ID, or pool ID is set. + """ + subAccountId: ID + "AMM pool status to filter for. This filter is ignored if any of the other filters are set." + status: AMMPoolStatus + "Optional pagination information" + pagination: Pagination + ): AMMPoolsConnection! + "An asset which is used in the vega network" asset("ID of the asset" id: ID!): Asset @@ -1433,6 +1451,8 @@ enum IndividualScope { INDIVIDUAL_SCOPE_IN_TEAM "All parties that are not part of a team are within the scope of this reward" INDIVIDUAL_SCOPE_NOT_IN_TEAM + "All keys representing AMMs are within the scope of this reward" + INDIVIDUAL_SCOPE_AMM } enum DistributionStrategy { @@ -7351,3 +7371,83 @@ type TimeWeightedNotionalPosition { "Time of the last block in which the metric was updated" lastUpdated: Timestamp! } + +"Connection type for retrieving AMM pool information" +type AMMPoolsConnection { + "Page of AMM Pools for the connection" + edges: [AMMPoolEdge] + "Current page information" + pageInfo: PageInfo +} + +"Edge type containing the AMM pool and cursor information returned by an AMMPoolConnection" +type AMMPoolEdge { + "AMM Pool information" + node: AMMPool! + "Cursor identifying the AMM Pool" + cursor: String! +} + +type AMMPool { + "Party ID of the pool creator" + partyID: ID! + "Market ID of the pool" + marketID: ID! + "Pool ID" + poolID: ID! + "Sub-account of the pool" + subAccount: String! + "Amount committed to the pool" + commitment: String! + "Parameters for the liquidity provision" + parameters: ConcentratedLiquidityParameters! + "Status of the pool" + status: AMMPoolStatus! + "Reason for status if applicable" + statusReason: AMMPoolStatusReason! +} + +type ConcentratedLiquidityParameters { + "Base amount" + base: String! + "Lower bound" + lowerBound: String! + "Upper bound" + upperBound: String! + "Margin ratio at the upper bound" + marginRatioAtUpperBound: String! + "Margin ratio at the lower bound" + marginRatioAtLowerBound: String! +} + +enum AMMPoolStatus { + "Status has not been specified" + STATUS_UNSPECIFIED + "AMM pool is active" + STATUS_ACTIVE + "AMM pool has been rejected" + STATUS_REJECTED + "AMM pool has been cancelled" + STATUS_CANCELLED + "AMM pool has been stopped" + STATUS_STOPPED +} + +enum AMMPoolStatusReason { + "Status has no reason specified" + STATUS_REASON_UNSPECIFIED + "AMM pool was cancelled by the party" + STATUS_REASON_CANCELLED_BY_PARTY + "AMM pool commitment cannot be fulfilled" + STATUS_REASON_CANNOT_FILL_COMMITMENT + "Party already owns an AMM pool on this market" + STATUS_REASON_PARTY_ALREADY_OWNS_A_POOL + "Party was closed out" + STATUS_REASON_PARTY_CLOSED_OUT + "Market has been closed" + STATUS_REASON_MARKET_CLOSED + "Commitment level for the pool is too low" + STATUS_REASON_COMMITMENT_TOO_LOW + "AMM pool cannot be rebased" + STATUS_REASON_CANNOT_REBASE +} diff --git a/datanode/networkhistory/service_test.go b/datanode/networkhistory/service_test.go index 8119a94649f..c0f786d8f3e 100644 --- a/datanode/networkhistory/service_test.go +++ b/datanode/networkhistory/service_test.go @@ -379,12 +379,12 @@ func TestMain(t *testing.M) { log.Infof("%s", goldenSourceHistorySegment[4000].HistorySegmentID) log.Infof("%s", goldenSourceHistorySegment[5000].HistorySegmentID) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[1000].HistorySegmentID, "QmTnNnYP9fCqRNUdG2ojpQJBvZ4omL8LjSPYrQ7DpbE2VH", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2000].HistorySegmentID, "QmTv5VEoNpAyERWxASX836YPXzND7es8Rc7fzuBK38BNDi", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2500].HistorySegmentID, "QmWzE8bEsUwabtcAd6WohLy58widR3xqaNacZDCpbt9TWt", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[3000].HistorySegmentID, "QmUPm6cQRNJ2B5GxRXauiAoSYWH2QZbezicVxPLGErSwy5", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[4000].HistorySegmentID, "QmR7vN8AuQT5BPiCKjLp8JfhFQZXLG7udtdMJgcnDTUcQa", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[5000].HistorySegmentID, "QmPJRAxy5gs3vqC6J91xx3MAo5KGHCJGbw62zqViQrHmTF", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[1000].HistorySegmentID, "QmbAPs7snY1oWfcqrggst5jx654dT69hfTugzsVEgHBiEC", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2000].HistorySegmentID, "QmPQrwGMEvAwTUf9GigkUeVMHFXwoga4kSyzfwY68hzZzR", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2500].HistorySegmentID, "QmZdNxTpbYHErBWH6Sdrw37T2ctuiXzqwd1YrXNxrwV9L1", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[3000].HistorySegmentID, "QmedBkE4stbsXDw4a6yKGrFji8pLbiGr1xgL7sz6X6Pmbe", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[4000].HistorySegmentID, "QmcB4CrF2yGHcKyAm5A3KW9VfHqfyiuVXPcnrk83euicPx", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[5000].HistorySegmentID, "QmV9wjagQGkj8bUCw5LtP8wDukHDxDWygtNgJgN3gX5R7s", snapshots) }, postgresRuntimePath, sqlFs) if exitCode != 0 { diff --git a/datanode/service/stubs.go b/datanode/service/stubs.go index cd86a1fd563..6cade6ce2df 100644 --- a/datanode/service/stubs.go +++ b/datanode/service/stubs.go @@ -69,6 +69,7 @@ type ( TimeWeightedNotionalPosition struct { *sqlstore.TimeWeightedNotionalPosition } + AMMPools struct{ *sqlstore.AMMPools } ) type ( @@ -219,3 +220,7 @@ func NewMarginModes(store *sqlstore.MarginModes) *MarginModes { func NewTimeWeightedNotionalPosition(store *sqlstore.TimeWeightedNotionalPosition) *TimeWeightedNotionalPosition { return &TimeWeightedNotionalPosition{TimeWeightedNotionalPosition: store} } + +func NewAMMPools(store *sqlstore.AMMPools) *AMMPools { + return &AMMPools{AMMPools: store} +} diff --git a/datanode/sqlstore/amm_pool.go b/datanode/sqlstore/amm_pool.go new file mode 100644 index 00000000000..0689538665a --- /dev/null +++ b/datanode/sqlstore/amm_pool.go @@ -0,0 +1,153 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package sqlstore + +import ( + "context" + "fmt" + + "code.vegaprotocol.io/vega/datanode/entities" + "code.vegaprotocol.io/vega/datanode/metrics" + v2 "code.vegaprotocol.io/vega/protos/data-node/api/v2" + + "github.com/georgysavva/scany/pgxscan" +) + +type AMMPools struct { + *ConnectionSource +} + +var ammPoolsOrdering = TableOrdering{ + ColumnOrdering{Name: "created_at", Sorting: ASC}, + ColumnOrdering{Name: "party_id", Sorting: DESC}, + ColumnOrdering{Name: "sub_account", Sorting: DESC}, + ColumnOrdering{Name: "market_id", Sorting: DESC}, + ColumnOrdering{Name: "pool_id", Sorting: DESC}, +} + +func NewAMMPools(connectionSource *ConnectionSource) *AMMPools { + return &AMMPools{ + ConnectionSource: connectionSource, + } +} + +func (p *AMMPools) Upsert(ctx context.Context, pool entities.AMMPool) error { + defer metrics.StartSQLQuery("AMMPools", "UpsertAMMPool") + if _, err := p.Connection.Exec(ctx, ` +insert into amm_pool(party_id, market_id, pool_id, sub_account, +commitment, status, status_reason, parameters_base, +parameters_lower_bound, parameters_upper_bound, +parameters_margin_ratio_at_lower_bound, parameters_margin_ratio_at_upper_bound, +created_at, last_updated) values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14) +on conflict (party_id, market_id, pool_id, sub_account) do update set + commitment=excluded.commitment, + status=excluded.status, + status_reason=excluded.status_reason, + parameters_base=excluded.parameters_base, + parameters_lower_bound=excluded.parameters_lower_bound, + parameters_upper_bound=excluded.parameters_upper_bound, + parameters_margin_ratio_at_lower_bound=excluded.parameters_margin_ratio_at_lower_bound, + parameters_margin_ratio_at_upper_bound=excluded.parameters_margin_ratio_at_upper_bound, + last_updated=excluded.last_updated;`, + pool.PartyID, + pool.MarketID, + pool.PoolID, + pool.SubAccount, + pool.Commitment, + pool.Status, + pool.StatusReason, + pool.ParametersBase, + pool.ParametersLowerBound, + pool.ParametersUpperBound, + pool.ParametersMarginRatioAtLowerBound, + pool.ParametersMarginRatioAtUpperBound, + pool.CreatedAt, + pool.LastUpdated, + ); err != nil { + return fmt.Errorf("could not upsert AMM Pool: %w", err) + } + + return nil +} + +func listBy[T entities.AMMPoolsFilter](ctx context.Context, connection Connection, fieldName string, filter T, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + var ( + pools []entities.AMMPool + pageInfo entities.PageInfo + args []interface{} + whereClause string + ) + whereClause, args = filter.Where(&fieldName, nextBindVar, args...) + query := fmt.Sprintf(`SELECT * FROM amm_pool WHERE %s`, whereClause) + query, args, err := PaginateQuery[entities.AMMPoolCursor](query, args, ammPoolsOrdering, pagination) + if err != nil { + return nil, pageInfo, err + } + + if err := pgxscan.Select(ctx, connection, &pools, query, args...); err != nil { + return nil, pageInfo, fmt.Errorf("could not list AMM Pools: %w", err) + } + + pools, pageInfo = entities.PageEntities[*v2.AMMPoolEdge](pools, pagination) + return pools, pageInfo, nil +} + +func (p *AMMPools) ListByMarket(ctx context.Context, marketID entities.MarketID, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + defer metrics.StartSQLQuery("AMMPools", "ListByMarket") + return listBy(ctx, p.Connection, "market_id", &marketID, pagination) +} + +func (p *AMMPools) ListByParty(ctx context.Context, partyID entities.PartyID, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + defer metrics.StartSQLQuery("AMMPools", "ListByParty") + + return listBy(ctx, p.Connection, "party_id", &partyID, pagination) +} + +func (p *AMMPools) ListByPool(ctx context.Context, poolID entities.AMMPoolID, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + defer metrics.StartSQLQuery("AMMPools", "ListByPool") + return listBy(ctx, p.Connection, "pool_id", &poolID, pagination) +} + +func (p *AMMPools) ListBySubAccount(ctx context.Context, subAccount entities.AccountID, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + defer metrics.StartSQLQuery("AMMPools", "ListBySubAccount") + return listBy(ctx, p.Connection, "sub_account", &subAccount, pagination) +} + +func (p *AMMPools) ListByStatus(ctx context.Context, status entities.AMMPoolStatus, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + defer metrics.StartSQLQuery("AMMPools", "ListByStatus") + return listBy(ctx, p.Connection, "status", &status, pagination) +} + +func (p *AMMPools) ListAll(ctx context.Context, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + defer metrics.StartSQLQuery("AMMPools", "ListAll") + var ( + pools []entities.AMMPool + pageInfo entities.PageInfo + args []interface{} + ) + query := `SELECT * FROM amm_pool` + query, args, err := PaginateQuery[entities.AMMPoolCursor](query, args, ammPoolsOrdering, pagination) + if err != nil { + return nil, pageInfo, err + } + + if err := pgxscan.Select(ctx, p.Connection, &pools, query, args...); err != nil { + return nil, pageInfo, fmt.Errorf("could not list AMM Pools: %w", err) + } + + pools, pageInfo = entities.PageEntities[*v2.AMMPoolEdge](pools, pagination) + return pools, pageInfo, nil +} diff --git a/datanode/sqlstore/amm_pool_test.go b/datanode/sqlstore/amm_pool_test.go new file mode 100644 index 00000000000..30bd8927987 --- /dev/null +++ b/datanode/sqlstore/amm_pool_test.go @@ -0,0 +1,754 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package sqlstore_test + +import ( + "context" + "math/rand" + "sort" + "testing" + "time" + + "code.vegaprotocol.io/vega/datanode/entities" + "code.vegaprotocol.io/vega/datanode/sqlstore" + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/libs/ptr" + + "github.com/georgysavva/scany/pgxscan" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestAMMPool_Upsert(t *testing.T) { + ctx := tempTransaction(t) + + bs := sqlstore.NewBlocks(connectionSource) + ps := sqlstore.NewAMMPools(connectionSource) + block := addTestBlock(t, ctx, bs) + + partyID := entities.PartyID(GenerateID()) + marketID := entities.MarketID(GenerateID()) + poolID := entities.AMMPoolID(GenerateID()) + subAccount := entities.AccountID(GenerateID()) + + t.Run("Upsert statuses", func(t *testing.T) { + upsertTests := []struct { + Status entities.AMMPoolStatus + Reason entities.AMMPoolStatusReason + }{ + {entities.AMMPoolStatusActive, entities.AMMPoolStatusReasonUnspecified}, + {entities.AMMPoolStatusStopped, entities.AMMPoolStatusReasonUnspecified}, + {entities.AMMPoolStatusCancelled, entities.AMMPoolStatusReasonUnspecified}, + {entities.AMMPoolStatusRejected, entities.AMMPoolStatusReasonCancelledByParty}, + {entities.AMMPoolStatusRejected, entities.AMMPoolStatusReasonCannotRebase}, + {entities.AMMPoolStatusRejected, entities.AMMPoolStatusReasonMarketClosed}, + {entities.AMMPoolStatusRejected, entities.AMMPoolStatusReasonCannotFillCommitment}, + {entities.AMMPoolStatusRejected, entities.AMMPoolStatusReasonCommitmentTooLow}, + {entities.AMMPoolStatusRejected, entities.AMMPoolStatusReasonPartyAlreadyOwnsAPool}, + {entities.AMMPoolStatusRejected, entities.AMMPoolStatusReasonPartyClosedOut}, + } + + upsertTime := block.VegaTime + for i, test := range upsertTests { + upsertTime = upsertTime.Add(time.Duration(i) * time.Minute) + pool := entities.AMMPool{ + PartyID: partyID, + MarketID: marketID, + PoolID: poolID, + SubAccount: subAccount, + Commitment: num.DecimalFromInt64(100), + Status: test.Status, + StatusReason: test.Reason, + ParametersBase: num.DecimalFromInt64(100), + ParametersLowerBound: num.DecimalFromInt64(100), + ParametersUpperBound: num.DecimalFromInt64(100), + ParametersMarginRatioAtLowerBound: num.DecimalFromInt64(100), + ParametersMarginRatioAtUpperBound: num.DecimalFromInt64(100), + CreatedAt: block.VegaTime, + LastUpdated: upsertTime, + } + require.NoError(t, ps.Upsert(ctx, pool)) + var upserted entities.AMMPool + require.NoError(t, pgxscan.Get( + ctx, + connectionSource.Connection, + &upserted, + `SELECT * FROM amm_pool WHERE party_id = $1 AND market_id = $2 AND pool_id = $3 AND sub_account = $4`, + partyID, marketID, poolID, subAccount)) + assert.Equal(t, pool, upserted) + } + }) + + t.Run("Upsert with different commitments and bounds", func(t *testing.T) { + amounts := []num.Decimal{ + num.DecimalFromInt64(100), + num.DecimalFromInt64(200), + num.DecimalFromInt64(300), + } + upsertTime := block.VegaTime + for i, amount := range amounts { + upsertTime = upsertTime.Add(time.Duration(i) * time.Minute) + pool := entities.AMMPool{ + PartyID: partyID, + MarketID: marketID, + PoolID: poolID, + SubAccount: subAccount, + Commitment: amount, + Status: entities.AMMPoolStatusActive, + StatusReason: entities.AMMPoolStatusReasonUnspecified, + ParametersBase: amount, + ParametersLowerBound: amount, + ParametersUpperBound: amount, + ParametersMarginRatioAtLowerBound: amount, + ParametersMarginRatioAtUpperBound: amount, + CreatedAt: block.VegaTime, + LastUpdated: upsertTime, + } + require.NoError(t, ps.Upsert(ctx, pool)) + var upserted entities.AMMPool + require.NoError(t, pgxscan.Get( + ctx, + connectionSource.Connection, + &upserted, + `SELECT * FROM amm_pool WHERE party_id = $1 AND market_id = $2 AND pool_id = $3 AND sub_account = $4`, + partyID, marketID, poolID, subAccount)) + assert.Equal(t, pool, upserted) + } + }) +} + +type partyAccounts struct { + PartyID entities.PartyID + SubAccountID entities.AccountID +} + +func setupAMMPoolsTest(ctx context.Context, t *testing.T) ( + *sqlstore.AMMPools, []entities.AMMPool, []partyAccounts, []entities.MarketID, []entities.AMMPoolID, +) { + t.Helper() + const ( + partyCount = 5 // every party will have a sub account associated for AMM and this sub account underlies all the AMM pools that are created + marketCount = 10 + poolCount = 10 + ) + + bs := sqlstore.NewBlocks(connectionSource) + ps := sqlstore.NewAMMPools(connectionSource) + + block := addTestBlock(t, tempTransaction(t), bs) + + pools := make([]entities.AMMPool, 0, partyCount*marketCount*poolCount) + parties := make([]partyAccounts, 0, partyCount) + markets := make([]entities.MarketID, 0, marketCount) + poolIDs := make([]entities.AMMPoolID, 0, poolCount) + + for i := 0; i < partyCount; i++ { + partyID := entities.PartyID(GenerateID()) + subAccount := entities.AccountID(GenerateID()) + + parties = append(parties, partyAccounts{PartyID: partyID, SubAccountID: subAccount}) + for j := 0; j < marketCount; j++ { + marketID := entities.MarketID(GenerateID()) + markets = append(markets, marketID) + for k := 0; k < poolCount; k++ { + poolID := entities.AMMPoolID(GenerateID()) + poolIDs = append(poolIDs, poolID) + status := entities.AMMPoolStatusActive + statusReason := entities.AMMPoolStatusReasonUnspecified + if (i+j+k)%2 == 0 { + status = entities.AMMPoolStatusStopped + statusReason = entities.AMMPoolStatusReasonCancelledByParty + } + pool := entities.AMMPool{ + PartyID: partyID, + MarketID: marketID, + PoolID: poolID, + SubAccount: subAccount, + Commitment: num.DecimalFromInt64(100), + Status: status, + StatusReason: statusReason, + ParametersBase: num.DecimalFromInt64(100), + ParametersLowerBound: num.DecimalFromInt64(100), + ParametersUpperBound: num.DecimalFromInt64(100), + ParametersMarginRatioAtLowerBound: num.DecimalFromInt64(100), + ParametersMarginRatioAtUpperBound: num.DecimalFromInt64(100), + CreatedAt: block.VegaTime, + LastUpdated: block.VegaTime, + } + require.NoError(t, ps.Upsert(ctx, pool)) + pools = append(pools, pool) + } + } + } + + pools = orderPools(pools) + + return ps, pools, parties, markets, poolIDs +} + +func orderPools(pools []entities.AMMPool) []entities.AMMPool { + sort.Slice(pools, func(i, j int) bool { + return pools[i].CreatedAt.After(pools[j].CreatedAt) || + (pools[i].CreatedAt == pools[j].CreatedAt && pools[i].PartyID < pools[j].PartyID) || + (pools[i].CreatedAt == pools[j].CreatedAt && pools[i].PartyID == pools[j].PartyID && pools[i].SubAccount < pools[j].SubAccount) || + (pools[i].CreatedAt == pools[j].CreatedAt && pools[i].PartyID == pools[j].PartyID && pools[i].SubAccount == pools[j].SubAccount && pools[i].MarketID < pools[j].MarketID) || + (pools[i].CreatedAt == pools[j].CreatedAt && pools[i].PartyID == pools[j].PartyID && pools[i].SubAccount == pools[j].SubAccount && pools[i].MarketID == pools[j].MarketID && pools[i].PoolID <= pools[j].PoolID) + }) + + return pools +} + +func TestAMMPools_ListAll(t *testing.T) { + ctx := tempTransaction(t) + + ps, pools, _, _, _ := setupAMMPoolsTest(ctx, t) + + t.Run("Should return all pools if no pagination is provided", func(t *testing.T) { + pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListAll(ctx, pagination) + require.NoError(t, err) + assert.Equal(t, len(pools), len(listedPools)) + assert.Equal(t, pools, listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: false, + HasPreviousPage: false, + StartCursor: pools[0].Cursor().Encode(), + EndCursor: pools[len(pools)-1].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the first page of pools", func(t *testing.T) { + pagination, err := entities.NewCursorPagination(ptr.From(int32(5)), nil, nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListAll(ctx, pagination) + require.NoError(t, err) + assert.Equal(t, 5, len(listedPools)) + assert.Equal(t, pools[:5], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: true, + HasPreviousPage: false, + StartCursor: pools[0].Cursor().Encode(), + EndCursor: pools[4].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the last page of pools", func(t *testing.T) { + pagination, err := entities.NewCursorPagination(nil, nil, ptr.From(int32(5)), nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListAll(ctx, pagination) + require.NoError(t, err) + assert.Equal(t, 5, len(listedPools)) + assert.Equal(t, pools[len(pools)-5:], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: false, + HasPreviousPage: true, + StartCursor: pools[len(pools)-5].Cursor().Encode(), + EndCursor: pools[len(pools)-1].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the requested page when paging forward", func(t *testing.T) { + pagination, err := entities.NewCursorPagination(ptr.From(int32(5)), ptr.From(pools[20].Cursor().Encode()), nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListAll(ctx, pagination) + require.NoError(t, err) + assert.Equal(t, 5, len(listedPools)) + assert.Equal(t, pools[21:26], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: true, + HasPreviousPage: true, + StartCursor: pools[21].Cursor().Encode(), + EndCursor: pools[25].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the request page when paging backward", func(t *testing.T) { + pagination, err := entities.NewCursorPagination(nil, nil, ptr.From(int32(5)), ptr.From(pools[20].Cursor().Encode()), true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListAll(ctx, pagination) + require.NoError(t, err) + assert.Equal(t, 5, len(listedPools)) + assert.Equal(t, pools[15:20], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: true, + HasPreviousPage: true, + StartCursor: pools[15].Cursor().Encode(), + EndCursor: pools[19].Cursor().Encode(), + }, pageInfo) + }) +} + +func filterPools(pools []entities.AMMPool, filter func(entities.AMMPool) bool) []entities.AMMPool { + filtered := make([]entities.AMMPool, 0, len(pools)) + for _, pool := range pools { + if filter(pool) { + filtered = append(filtered, pool) + } + } + return filtered +} + +func TestAMMPools_ListByMarket(t *testing.T) { + ctx := tempTransaction(t) + + ps, pools, _, markets, _ := setupAMMPoolsTest(ctx, t) + src := rand.NewSource(time.Now().UnixNano()) + r := rand.New(src) + n := len(markets) + + t.Run("Should return all pools if no pagination is provided", func(t *testing.T) { + // Randomly pick a market + market := markets[r.Intn(n)] + want := orderPools(filterPools(pools, func(pool entities.AMMPool) bool { + return pool.MarketID == market + })) + pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByMarket(ctx, market, pagination) + require.NoError(t, err) + assert.Equal(t, len(want), len(listedPools)) + assert.Equal(t, want, listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: false, + HasPreviousPage: false, + StartCursor: want[0].Cursor().Encode(), + EndCursor: want[len(want)-1].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the first page of pools", func(t *testing.T) { + // Randomly pick a market + market := markets[r.Intn(n)] + want := orderPools(filterPools(pools, func(pool entities.AMMPool) bool { + return pool.MarketID == market + })) + pagination, err := entities.NewCursorPagination(ptr.From(int32(3)), nil, nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByMarket(ctx, market, pagination) + require.NoError(t, err) + assert.Equal(t, 3, len(listedPools)) + assert.Equal(t, want[:3], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: true, + HasPreviousPage: false, + StartCursor: want[0].Cursor().Encode(), + EndCursor: want[2].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the last page of pools", func(t *testing.T) { + // Randomly pick a market + market := markets[r.Intn(n)] + want := orderPools(filterPools(pools, func(pool entities.AMMPool) bool { + return pool.MarketID == market + })) + pagination, err := entities.NewCursorPagination(nil, nil, ptr.From(int32(3)), nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByMarket(ctx, market, pagination) + require.NoError(t, err) + assert.Equal(t, 3, len(listedPools)) + assert.Equal(t, want[len(want)-3:], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: false, + HasPreviousPage: true, + StartCursor: want[len(want)-3].Cursor().Encode(), + EndCursor: want[len(want)-1].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the requested page when paging forward", func(t *testing.T) { + // Randomly pick a market + market := markets[r.Intn(n)] + want := orderPools(filterPools(pools, func(pool entities.AMMPool) bool { + return pool.MarketID == market + })) + pagination, err := entities.NewCursorPagination(ptr.From(int32(3)), ptr.From(want[0].Cursor().Encode()), nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByMarket(ctx, market, pagination) + require.NoError(t, err) + assert.Equal(t, 3, len(listedPools)) + assert.Equal(t, want[1:4], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: true, + HasPreviousPage: true, + StartCursor: want[1].Cursor().Encode(), + EndCursor: want[3].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the request page when paging backward", func(t *testing.T) { + // Randomly pick a market + market := markets[r.Intn(n)] + want := orderPools(filterPools(pools, func(pool entities.AMMPool) bool { + return pool.MarketID == market + })) + pagination, err := entities.NewCursorPagination(nil, nil, ptr.From(int32(3)), ptr.From(want[4].Cursor().Encode()), true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByMarket(ctx, market, pagination) + require.NoError(t, err) + assert.Equal(t, 3, len(listedPools)) + assert.Equal(t, want[1:4], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: true, + HasPreviousPage: true, + StartCursor: want[1].Cursor().Encode(), + EndCursor: want[3].Cursor().Encode(), + }, pageInfo) + }) +} + +func TestAMMPools_ListByParty(t *testing.T) { + ctx := tempTransaction(t) + + ps, pools, parties, _, _ := setupAMMPoolsTest(ctx, t) + src := rand.NewSource(time.Now().UnixNano()) + r := rand.New(src) + n := len(parties) + + t.Run("Should return all pools if no pagination is provided", func(t *testing.T) { + // Randomly pick a party + party := parties[r.Intn(n)] + want := filterPools(pools, func(pool entities.AMMPool) bool { + return pool.PartyID == party.PartyID + }) + pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByParty(ctx, party.PartyID, pagination) + require.NoError(t, err) + assert.Equal(t, len(want), len(listedPools)) + assert.Equal(t, want, listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: false, + HasPreviousPage: false, + StartCursor: want[0].Cursor().Encode(), + EndCursor: want[len(want)-1].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the first page of pools", func(t *testing.T) { + // Randomly pick a party + party := parties[r.Intn(n)] + want := filterPools(pools, func(pool entities.AMMPool) bool { + return pool.PartyID == party.PartyID + }) + pagination, err := entities.NewCursorPagination(ptr.From(int32(5)), nil, nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByParty(ctx, party.PartyID, pagination) + require.NoError(t, err) + assert.Equal(t, 5, len(listedPools)) + assert.Equal(t, want[:5], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: true, + HasPreviousPage: false, + StartCursor: want[0].Cursor().Encode(), + EndCursor: want[4].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the last page of pools", func(t *testing.T) { + // Randomly pick a party + party := parties[r.Intn(n)] + want := filterPools(pools, func(pool entities.AMMPool) bool { + return pool.PartyID == party.PartyID + }) + pagination, err := entities.NewCursorPagination(nil, nil, ptr.From(int32(5)), nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByParty(ctx, party.PartyID, pagination) + require.NoError(t, err) + assert.Equal(t, 5, len(listedPools)) + assert.Equal(t, want[len(want)-5:], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: false, + HasPreviousPage: true, + StartCursor: want[len(want)-5].Cursor().Encode(), + EndCursor: want[len(want)-1].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the requested page when paging forward", func(t *testing.T) { + // Randomly pick a party + party := parties[r.Intn(n)] + want := filterPools(pools, func(pool entities.AMMPool) bool { + return pool.PartyID == party.PartyID + }) + pagination, err := entities.NewCursorPagination(ptr.From(int32(5)), ptr.From(want[10].Cursor().Encode()), nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByParty(ctx, party.PartyID, pagination) + require.NoError(t, err) + assert.Equal(t, 5, len(listedPools)) + assert.Equal(t, want[11:16], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: true, + HasPreviousPage: true, + StartCursor: want[11].Cursor().Encode(), + EndCursor: want[15].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the request page when paging backward", func(t *testing.T) { + // Randomly pick a party + party := parties[r.Intn(n)] + want := filterPools(pools, func(pool entities.AMMPool) bool { + return pool.PartyID == party.PartyID + }) + pagination, err := entities.NewCursorPagination(nil, nil, ptr.From(int32(5)), ptr.From(want[10].Cursor().Encode()), true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByParty(ctx, party.PartyID, pagination) + require.NoError(t, err) + assert.Equal(t, 5, len(listedPools)) + assert.Equal(t, want[5:10], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: true, + HasPreviousPage: true, + StartCursor: want[5].Cursor().Encode(), + EndCursor: want[9].Cursor().Encode(), + }, pageInfo) + }) +} + +func TestAMMPools_ListByPool(t *testing.T) { + ctx := tempTransaction(t) + + ps, pools, _, _, poolIDs := setupAMMPoolsTest(ctx, t) + src := rand.NewSource(time.Now().UnixNano()) + r := rand.New(src) + n := len(poolIDs) + + t.Run("Should return the pool if the pool ID exists", func(t *testing.T) { + pa := poolIDs[r.Intn(n)] + want := filterPools(pools, func(pool entities.AMMPool) bool { + return pool.PoolID == pa + }) + pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByPool(ctx, pa, pagination) + require.NoError(t, err) + assert.Equal(t, len(want), len(listedPools)) + assert.Equal(t, want, listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: false, + HasPreviousPage: false, + StartCursor: want[0].Cursor().Encode(), + EndCursor: want[len(want)-1].Cursor().Encode(), + }, pageInfo) + }) +} + +func TestAMMPools_ListBySubAccount(t *testing.T) { + ctx := tempTransaction(t) + + ps, pools, parties, _, _ := setupAMMPoolsTest(ctx, t) + src := rand.NewSource(time.Now().UnixNano()) + r := rand.New(src) + n := len(parties) + + t.Run("Should return all pools if no pagination is provided", func(t *testing.T) { + // Randomly pick a sub account + party := parties[r.Intn(n)] + want := filterPools(pools, func(pool entities.AMMPool) bool { + return pool.SubAccount == party.SubAccountID + }) + pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListBySubAccount(ctx, party.SubAccountID, pagination) + require.NoError(t, err) + assert.Equal(t, len(want), len(listedPools)) + assert.Equal(t, want, listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: false, + HasPreviousPage: false, + StartCursor: want[0].Cursor().Encode(), + EndCursor: want[len(want)-1].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the first page of pools", func(t *testing.T) { + // Randomly pick a sub account + party := parties[r.Intn(n)] + want := filterPools(pools, func(pool entities.AMMPool) bool { + return pool.SubAccount == party.SubAccountID + }) + pagination, err := entities.NewCursorPagination(ptr.From(int32(5)), nil, nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListBySubAccount(ctx, party.SubAccountID, pagination) + require.NoError(t, err) + assert.Equal(t, 5, len(listedPools)) + assert.Equal(t, want[:5], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: true, + HasPreviousPage: false, + StartCursor: want[0].Cursor().Encode(), + EndCursor: want[4].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the last page of pools", func(t *testing.T) { + // Randomly pick a sub account + party := parties[r.Intn(n)] + want := filterPools(pools, func(pool entities.AMMPool) bool { + return pool.SubAccount == party.SubAccountID + }) + pagination, err := entities.NewCursorPagination(nil, nil, ptr.From(int32(5)), nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListBySubAccount(ctx, party.SubAccountID, pagination) + require.NoError(t, err) + assert.Equal(t, 5, len(listedPools)) + assert.Equal(t, want[len(want)-5:], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: false, + HasPreviousPage: true, + StartCursor: want[len(want)-5].Cursor().Encode(), + EndCursor: want[len(want)-1].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the requested page when paging forward", func(t *testing.T) { + // Randomly pick a sub account + party := parties[r.Intn(n)] + want := filterPools(pools, func(pool entities.AMMPool) bool { + return pool.SubAccount == party.SubAccountID + }) + pagination, err := entities.NewCursorPagination(ptr.From(int32(5)), ptr.From(want[10].Cursor().Encode()), nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListBySubAccount(ctx, party.SubAccountID, pagination) + require.NoError(t, err) + assert.Equal(t, 5, len(listedPools)) + assert.Equal(t, want[11:16], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: true, + HasPreviousPage: true, + StartCursor: want[11].Cursor().Encode(), + EndCursor: want[15].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the request page when paging backward", func(t *testing.T) { + // Randomly pick a sub account + party := parties[r.Intn(n)] + want := filterPools(pools, func(pool entities.AMMPool) bool { + return pool.SubAccount == party.SubAccountID + }) + pagination, err := entities.NewCursorPagination(nil, nil, ptr.From(int32(5)), ptr.From(want[10].Cursor().Encode()), true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListBySubAccount(ctx, party.SubAccountID, pagination) + require.NoError(t, err) + assert.Equal(t, 5, len(listedPools)) + assert.Equal(t, want[5:10], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: true, + HasPreviousPage: true, + StartCursor: want[5].Cursor().Encode(), + EndCursor: want[9].Cursor().Encode(), + }, pageInfo) + }) +} + +func TestAMMPools_ListByStatus(t *testing.T) { + ctx := tempTransaction(t) + + ps, pools, _, _, _ := setupAMMPoolsTest(ctx, t) + + t.Run("Should return all pools if no pagination is provided", func(t *testing.T) { + want := filterPools(pools, func(pool entities.AMMPool) bool { + return pool.Status == entities.AMMPoolStatusActive + }) + pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByStatus(ctx, entities.AMMPoolStatusActive, pagination) + require.NoError(t, err) + assert.Equal(t, len(want), len(listedPools)) + assert.Equal(t, want, listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: false, + HasPreviousPage: false, + StartCursor: want[0].Cursor().Encode(), + EndCursor: want[len(want)-1].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the first page of pools", func(t *testing.T) { + want := filterPools(pools, func(pool entities.AMMPool) bool { + return pool.Status == entities.AMMPoolStatusActive + }) + pagination, err := entities.NewCursorPagination(ptr.From(int32(5)), nil, nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByStatus(ctx, entities.AMMPoolStatusActive, pagination) + require.NoError(t, err) + assert.Equal(t, 5, len(listedPools)) + assert.Equal(t, want[:5], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: true, + HasPreviousPage: false, + StartCursor: want[0].Cursor().Encode(), + EndCursor: want[4].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the last page of pools", func(t *testing.T) { + want := filterPools(pools, func(pool entities.AMMPool) bool { + return pool.Status == entities.AMMPoolStatusActive + }) + pagination, err := entities.NewCursorPagination(nil, nil, ptr.From(int32(5)), nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByStatus(ctx, entities.AMMPoolStatusActive, pagination) + require.NoError(t, err) + assert.Equal(t, 5, len(listedPools)) + assert.Equal(t, want[len(want)-5:], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: false, + HasPreviousPage: true, + StartCursor: want[len(want)-5].Cursor().Encode(), + EndCursor: want[len(want)-1].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the requested page when paging forward", func(t *testing.T) { + want := filterPools(pools, func(pool entities.AMMPool) bool { + return pool.Status == entities.AMMPoolStatusActive + }) + pagination, err := entities.NewCursorPagination(ptr.From(int32(5)), ptr.From(want[10].Cursor().Encode()), nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByStatus(ctx, entities.AMMPoolStatusActive, pagination) + require.NoError(t, err) + assert.Equal(t, 5, len(listedPools)) + assert.Equal(t, want[11:16], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: true, + HasPreviousPage: true, + StartCursor: want[11].Cursor().Encode(), + EndCursor: want[15].Cursor().Encode(), + }, pageInfo) + }) + + t.Run("Should return the request page when paging backward", func(t *testing.T) { + want := filterPools(pools, func(pool entities.AMMPool) bool { + return pool.Status == entities.AMMPoolStatusActive + }) + pagination, err := entities.NewCursorPagination(nil, nil, ptr.From(int32(5)), ptr.From(want[10].Cursor().Encode()), true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByStatus(ctx, entities.AMMPoolStatusActive, pagination) + require.NoError(t, err) + assert.Equal(t, 5, len(listedPools)) + assert.Equal(t, want[5:10], listedPools) + assert.Equal(t, entities.PageInfo{ + HasNextPage: true, + HasPreviousPage: true, + StartCursor: want[5].Cursor().Encode(), + EndCursor: want[9].Cursor().Encode(), + }, pageInfo) + }) +} diff --git a/datanode/sqlstore/migrations/0107_amm_pools.sql b/datanode/sqlstore/migrations/0107_amm_pools.sql new file mode 100644 index 00000000000..a3888864ea3 --- /dev/null +++ b/datanode/sqlstore/migrations/0107_amm_pools.sql @@ -0,0 +1,48 @@ +-- +goose Up + +-- +goose StatementBegin +do $$ +begin + if not exists (select 1 from pg_type where typname = 'amm_pool_status') then + create type amm_pool_status as enum( + 'STATUS_UNSPECIFIED', 'STATUS_ACTIVE', 'STATUS_REJECTED', 'STATUS_CANCELLED', 'STATUS_STOPPED', 'STATUS_REDUCE_ONLY' + ); + end if; +end $$; +-- +goose StatementEnd + +-- +goose StatementBegin +do $$ +begin + if not exists (select 1 from pg_type where typname = 'amm_pool_status_reason') then + create type amm_pool_status_reason as enum( + 'STATUS_REASON_UNSPECIFIED', 'STATUS_REASON_CANCELLED_BY_PARTY', 'STATUS_REASON_CANNOT_FILL_COMMITMENT', + 'STATUS_REASON_PARTY_ALREADY_OWNS_A_POOL', 'STATUS_REASON_PARTY_CLOSED_OUT', 'STATUS_REASON_MARKET_CLOSED', + 'STATUS_REASON_COMMITMENT_TOO_LOW', 'STATUS_REASON_CANNOT_REBASE' + ); + end if; +end $$; +-- +goose StatementEnd + +create table if not exists amm_pool ( + party_id bytea not null, + market_id bytea not null, + pool_id bytea not null, + sub_account bytea not null, + commitment numeric not null, + status amm_pool_status not null, + status_reason amm_pool_status_reason not null, + parameters_base numeric not null, + parameters_lower_bound numeric not null, + parameters_upper_bound numeric not null, + parameters_margin_ratio_at_upper_bound numeric not null, + parameters_margin_ratio_at_lower_bound numeric not null, + created_at timestamp with time zone not null, + last_updated timestamp with time zone not null, + primary key (party_id, market_id, pool_id, sub_account) +); + +-- +goose Down +drop table if exists amm_pool; +drop type if exists amm_pool_status_reason; +drop type if exists amm_pool_status; diff --git a/datanode/sqlsubscribers/amm_pool.go b/datanode/sqlsubscribers/amm_pool.go new file mode 100644 index 00000000000..195c36ab90c --- /dev/null +++ b/datanode/sqlsubscribers/amm_pool.go @@ -0,0 +1,67 @@ +// Copyright (C) 2023 Gobalsky Labs Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package sqlsubscribers + +import ( + "context" + "fmt" + + "code.vegaprotocol.io/vega/core/events" + "code.vegaprotocol.io/vega/datanode/entities" + eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" +) + +type AMMPoolEvent interface { + events.Event + AMMPool() *eventspb.AMMPool +} + +type AMMPoolStore interface { + Upsert(ctx context.Context, pool entities.AMMPool) error +} + +type AMMPools struct { + subscriber + store AMMPoolStore +} + +func NewAMMPools(store AMMPoolStore) *AMMPools { + return &AMMPools{ + store: store, + } +} + +func (p *AMMPools) Types() []events.Type { + return []events.Type{events.AMMPoolEvent} +} + +func (p *AMMPools) Push(ctx context.Context, evt events.Event) error { + return p.consume(ctx, evt.(AMMPoolEvent)) +} + +func (p *AMMPools) consume(ctx context.Context, pe AMMPoolEvent) error { + ammPool, err := entities.AMMPoolFromProto(pe.AMMPool(), p.vegaTime) + if err != nil { + return fmt.Errorf("cannot parse AMM Pool event from proto message: %w", err) + } + + err = p.store.Upsert(ctx, ammPool) + if err != nil { + return fmt.Errorf("could not save AMM Pool event: %w", err) + } + + return nil +} diff --git a/libs/num/uint.go b/libs/num/uint.go index 4e0863f6f0d..d425c97c478 100644 --- a/libs/num/uint.go +++ b/libs/num/uint.go @@ -371,6 +371,11 @@ func (u *Uint) Exp(x, y *Uint) *Uint { return u } +func (u *Uint) Sqrt(x *Uint) *Uint { + u.u.Sqrt(&x.u) + return u +} + // LT with check if the value stored in u is // lesser than oth // this is equivalent to: diff --git a/libs/num/uint_test.go b/libs/num/uint_test.go index 15854d941d5..69b256093de 100644 --- a/libs/num/uint_test.go +++ b/libs/num/uint_test.go @@ -244,3 +244,10 @@ func TestMedian(t *testing.T) { require.Equal(t, "10", num.Median([]*num.Uint{num.NewUint(10), num.NewUint(5), num.NewUint(17)}).String()) require.Equal(t, "11", num.Median([]*num.Uint{num.NewUint(10), num.NewUint(5), num.NewUint(12), num.NewUint(17)}).String()) } + +func TestSqrt(t *testing.T) { + n := num.NewUint(123456789) + + n.Sqrt(n) + assert.Equal(t, "11111", n.String()) +} diff --git a/protos/data-node/api/v2/trading_data.pb.go b/protos/data-node/api/v2/trading_data.pb.go index e779912f145..32e744921ee 100644 --- a/protos/data-node/api/v2/trading_data.pb.go +++ b/protos/data-node/api/v2/trading_data.pb.go @@ -25803,6 +25803,263 @@ func (x *GetTimeWeightedNotionalPositionResponse) GetTimeWeightedNotionalPositio return nil } +type ListAMMPoolsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Party ID to filter for. + PartyId *string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3,oneof" json:"party_id,omitempty"` + // Market ID to filter for. If party ID is provided, the market filter is ignored + MarketId *string `protobuf:"bytes,2,opt,name=market_id,json=marketId,proto3,oneof" json:"market_id,omitempty"` + // Pool ID to filter for. If party ID or market ID is provided, the pool ID filter is ignored. + PoolId *string `protobuf:"bytes,3,opt,name=pool_id,json=poolId,proto3,oneof" json:"pool_id,omitempty"` + // Party's underlying AMM sub-account to filter for. A party's AMM sub-account will remain the + // same regardless of the AMM pool. + SubAccount *string `protobuf:"bytes,4,opt,name=sub_account,json=subAccount,proto3,oneof" json:"sub_account,omitempty"` + // Filter for AMM pools with the given status. This filter will be ignored if any of the other + // filters have been set. + Status *v1.AMMPool_Status `protobuf:"varint,5,opt,name=status,proto3,enum=vega.events.v1.AMMPool_Status,oneof" json:"status,omitempty"` + // Pagination controls. + Pagination *Pagination `protobuf:"bytes,6,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` +} + +func (x *ListAMMPoolsRequest) Reset() { + *x = ListAMMPoolsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[413] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListAMMPoolsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAMMPoolsRequest) ProtoMessage() {} + +func (x *ListAMMPoolsRequest) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[413] + 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 ListAMMPoolsRequest.ProtoReflect.Descriptor instead. +func (*ListAMMPoolsRequest) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{413} +} + +func (x *ListAMMPoolsRequest) GetPartyId() string { + if x != nil && x.PartyId != nil { + return *x.PartyId + } + return "" +} + +func (x *ListAMMPoolsRequest) GetMarketId() string { + if x != nil && x.MarketId != nil { + return *x.MarketId + } + return "" +} + +func (x *ListAMMPoolsRequest) GetPoolId() string { + if x != nil && x.PoolId != nil { + return *x.PoolId + } + return "" +} + +func (x *ListAMMPoolsRequest) GetSubAccount() string { + if x != nil && x.SubAccount != nil { + return *x.SubAccount + } + return "" +} + +func (x *ListAMMPoolsRequest) GetStatus() v1.AMMPool_Status { + if x != nil && x.Status != nil { + return *x.Status + } + return v1.AMMPool_Status(0) +} + +func (x *ListAMMPoolsRequest) GetPagination() *Pagination { + if x != nil { + return x.Pagination + } + return nil +} + +type ListAMMPoolsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Page of AMM pool data and corresponding page information. + AmmPools *AMMPoolsConnection `protobuf:"bytes,1,opt,name=amm_pools,json=ammPools,proto3" json:"amm_pools,omitempty"` +} + +func (x *ListAMMPoolsResponse) Reset() { + *x = ListAMMPoolsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[414] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListAMMPoolsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAMMPoolsResponse) ProtoMessage() {} + +func (x *ListAMMPoolsResponse) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[414] + 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 ListAMMPoolsResponse.ProtoReflect.Descriptor instead. +func (*ListAMMPoolsResponse) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{414} +} + +func (x *ListAMMPoolsResponse) GetAmmPools() *AMMPoolsConnection { + if x != nil { + return x.AmmPools + } + return nil +} + +type AMMPoolsConnection struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Page of AMM pool data and their corresponding cursors. + Edges []*AMMPoolEdge `protobuf:"bytes,1,rep,name=edges,proto3" json:"edges,omitempty"` + // Page information that is used for fetching further pages. + PageInfo *PageInfo `protobuf:"bytes,2,opt,name=page_info,json=pageInfo,proto3" json:"page_info,omitempty"` +} + +func (x *AMMPoolsConnection) Reset() { + *x = AMMPoolsConnection{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[415] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AMMPoolsConnection) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AMMPoolsConnection) ProtoMessage() {} + +func (x *AMMPoolsConnection) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[415] + 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 AMMPoolsConnection.ProtoReflect.Descriptor instead. +func (*AMMPoolsConnection) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{415} +} + +func (x *AMMPoolsConnection) GetEdges() []*AMMPoolEdge { + if x != nil { + return x.Edges + } + return nil +} + +func (x *AMMPoolsConnection) GetPageInfo() *PageInfo { + if x != nil { + return x.PageInfo + } + return nil +} + +type AMMPoolEdge struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // AMM pool data. + Node *v1.AMMPool `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` + // Cursor that can be used to fetch further pages. + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` +} + +func (x *AMMPoolEdge) Reset() { + *x = AMMPoolEdge{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[416] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AMMPoolEdge) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AMMPoolEdge) ProtoMessage() {} + +func (x *AMMPoolEdge) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[416] + 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 AMMPoolEdge.ProtoReflect.Descriptor instead. +func (*AMMPoolEdge) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{416} +} + +func (x *AMMPoolEdge) GetNode() *v1.AMMPool { + if x != nil { + return x.Node + } + return nil +} + +func (x *AMMPoolEdge) GetCursor() string { + if x != nil { + return x.Cursor + } + return "" +} + var File_data_node_api_v2_trading_data_proto protoreflect.FileDescriptor var file_data_node_api_v2_trading_data_proto_rawDesc = []byte{ @@ -29520,1033 +29777,1081 @@ var file_data_node_api_v2_trading_data_proto_rawDesc = []byte{ 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1c, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0xaa, 0x01, 0x0a, 0x10, 0x4c, 0x65, 0x64, 0x67, - 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x22, 0x0a, 0x1e, - 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x46, 0x49, 0x45, - 0x4c, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x26, 0x0a, 0x22, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, - 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, - 0x52, 0x4f, 0x4d, 0x5f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4c, 0x45, 0x44, 0x47, - 0x45, 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x41, - 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x4f, 0x5f, 0x49, 0x44, 0x10, 0x02, 0x12, 0x24, - 0x0a, 0x20, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x46, - 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x10, 0x03, 0x2a, 0xb0, 0x01, 0x0a, 0x0c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, - 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, - 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x43, - 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, - 0x59, 0x5f, 0x49, 0x44, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, - 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x49, 0x44, - 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, - 0x45, 0x4c, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x04, 0x12, - 0x16, 0x0a, 0x12, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x05, 0x2a, 0xad, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, - 0x1e, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x24, 0x0a, 0x20, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, - 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, - 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x54, 0x52, 0x41, 0x4e, 0x53, - 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, - 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x10, 0x02, 0x12, 0x2a, 0x0a, 0x26, 0x54, - 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x5f, 0x4f, 0x52, - 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x10, 0x03, 0x2a, 0xde, 0x02, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x41, 0x42, 0x4c, - 0x45, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, - 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, - 0x53, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x4c, - 0x45, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, - 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, - 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x10, 0x05, 0x12, 0x10, - 0x0a, 0x0c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x45, 0x53, 0x10, 0x06, - 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, - 0x5f, 0x44, 0x41, 0x54, 0x41, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x42, 0x4c, 0x45, - 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x53, 0x10, 0x08, - 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, - 0x4f, 0x4e, 0x53, 0x10, 0x09, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4c, - 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, - 0x4f, 0x4e, 0x53, 0x10, 0x0a, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4d, - 0x41, 0x52, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x0b, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x41, 0x42, 0x4c, - 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x53, 0x10, 0x0c, 0x12, 0x15, 0x0a, 0x11, - 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, - 0x53, 0x10, 0x0d, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x42, 0x4c, 0x4f, - 0x43, 0x4b, 0x53, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x52, - 0x45, 0x57, 0x41, 0x52, 0x44, 0x53, 0x10, 0x0f, 0x32, 0xd2, 0x77, 0x0a, 0x12, 0x54, 0x72, 0x61, - 0x64, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x6a, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, - 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0d, 0x92, 0x41, - 0x0a, 0x0a, 0x08, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x75, 0x0a, 0x0f, 0x4f, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x27, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, - 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x4e, 0x6f, - 0x64, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, - 0x0a, 0x08, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, - 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x62, 0x0a, 0x0a, - 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, - 0x12, 0x77, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, - 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x6d, 0x0a, 0x0d, 0x4f, 0x62, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x30, 0x01, 0x12, 0x68, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, - 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, - 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xeb, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x4d, 0x4d, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x20, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x70, 0x6f, 0x6f, 0x6c, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x24, 0x0a, 0x0b, 0x73, 0x75, 0x62, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4d, 0x4d, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x04, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x48, 0x05, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, + 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, + 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, + 0x73, 0x75, 0x62, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x58, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x4d, 0x4d, + 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, + 0x09, 0x61, 0x6d, 0x6d, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x41, 0x4d, 0x4d, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x61, 0x6d, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x22, + 0x80, 0x01, 0x0a, 0x12, 0x41, 0x4d, 0x4d, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x4d, 0x4d, 0x50, 0x6f, 0x6f, 0x6c, 0x45, + 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x09, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x22, 0x52, 0x0a, 0x0b, 0x41, 0x4d, 0x4d, 0x50, 0x6f, 0x6f, 0x6c, 0x45, 0x64, 0x67, + 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x4d, 0x4d, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x2a, 0xaa, 0x01, 0x0a, 0x10, 0x4c, 0x65, 0x64, 0x67, 0x65, + 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x22, 0x0a, 0x1e, 0x4c, + 0x45, 0x44, 0x47, 0x45, 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x46, 0x49, 0x45, 0x4c, + 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x26, 0x0a, 0x22, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, + 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x52, + 0x4f, 0x4d, 0x5f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4c, 0x45, 0x44, 0x47, 0x45, + 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x41, 0x43, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x4f, 0x5f, 0x49, 0x44, 0x10, 0x02, 0x12, 0x24, 0x0a, + 0x20, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x46, 0x49, + 0x45, 0x4c, 0x44, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x10, 0x03, 0x2a, 0xb0, 0x01, 0x0a, 0x0c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, + 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, + 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x43, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, + 0x5f, 0x49, 0x44, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, + 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x49, 0x44, 0x10, + 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, + 0x4c, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x04, 0x12, 0x16, + 0x0a, 0x12, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x10, 0x05, 0x2a, 0xad, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x1e, + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x24, 0x0a, 0x20, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, + 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, + 0x46, 0x52, 0x4f, 0x4d, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, + 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x10, 0x02, 0x12, 0x2a, 0x0a, 0x26, 0x54, 0x52, + 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x5f, 0x4f, 0x52, 0x5f, + 0x46, 0x52, 0x4f, 0x4d, 0x10, 0x03, 0x2a, 0xde, 0x02, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x41, 0x42, 0x4c, 0x45, + 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x54, + 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x53, + 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, + 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x42, + 0x4c, 0x45, 0x5f, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x54, + 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x10, 0x05, 0x12, 0x10, 0x0a, + 0x0c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x45, 0x53, 0x10, 0x06, 0x12, + 0x15, 0x0a, 0x11, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, + 0x44, 0x41, 0x54, 0x41, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, + 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x53, 0x10, 0x08, 0x12, + 0x13, 0x0a, 0x0f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, + 0x4e, 0x53, 0x10, 0x09, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x49, + 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, + 0x4e, 0x53, 0x10, 0x0a, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4d, 0x41, + 0x52, 0x4b, 0x45, 0x54, 0x53, 0x10, 0x0b, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x41, 0x42, 0x4c, 0x45, + 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x53, 0x10, 0x0c, 0x12, 0x15, 0x0a, 0x11, 0x54, + 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, 0x53, + 0x10, 0x0d, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x42, 0x4c, 0x4f, 0x43, + 0x4b, 0x53, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x52, 0x45, + 0x57, 0x41, 0x52, 0x44, 0x53, 0x10, 0x0f, 0x32, 0xbd, 0x78, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6a, + 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x6e, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x71, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x11, 0x88, 0x02, 0x01, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x77, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0d, 0x92, 0x41, 0x0a, + 0x0a, 0x08, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x75, 0x0a, 0x0f, 0x4f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x30, + 0x01, 0x12, 0x5a, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x4e, 0x6f, 0x64, + 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, + 0x08, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, + 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, + 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x4c, + 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, - 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x79, - 0x0a, 0x10, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x01, 0x12, 0x7f, 0x0a, 0x11, 0x4c, 0x69, 0x73, - 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x29, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, + 0x77, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, + 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x6d, 0x0a, 0x0d, 0x4f, 0x62, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x73, 0x30, 0x01, 0x12, 0x68, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x74, + 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, + 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x6e, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x71, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x92, 0x41, 0x10, 0x0a, 0x0e, 0x4c, 0x65, 0x64, 0x67, - 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x6f, 0x0a, 0x13, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, - 0x42, 0x6f, 0x64, 0x79, 0x22, 0x13, 0x92, 0x41, 0x10, 0x0a, 0x0e, 0x4c, 0x65, 0x64, 0x67, 0x65, - 0x72, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x30, 0x01, 0x12, 0x7c, 0x0a, 0x12, 0x4c, - 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x73, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x11, 0x88, 0x02, 0x01, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x77, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x50, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x6c, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x79, 0x0a, + 0x10, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x30, 0x01, 0x12, 0x7f, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, + 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0d, 0x92, 0x41, 0x0a, 0x0a, - 0x08, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x7e, 0x0a, 0x13, 0x47, 0x65, 0x74, - 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, + 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x92, 0x41, 0x10, 0x0a, 0x0e, 0x4c, 0x65, 0x64, 0x67, 0x65, + 0x72, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x6f, 0x0a, 0x13, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, - 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, - 0x73, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x81, 0x01, - 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, - 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x76, 0x32, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, + 0x6f, 0x64, 0x79, 0x22, 0x13, 0x92, 0x41, 0x10, 0x0a, 0x0e, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, + 0x20, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x30, 0x01, 0x12, 0x7c, 0x0a, 0x12, 0x4c, 0x69, + 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x7e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4c, + 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, + 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, + 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, + 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, + 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x81, 0x01, 0x0a, + 0x14, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, + 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, + 0x12, 0x80, 0x01, 0x0a, 0x13, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x73, 0x12, 0x80, 0x01, 0x0a, 0x13, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x73, 0x30, 0x01, 0x12, 0x95, 0x01, 0x0a, 0x1a, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x73, 0x30, 0x01, 0x12, 0x95, 0x01, 0x0a, 0x1a, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x65, 0x70, 0x74, 0x68, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, - 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x30, 0x01, 0x12, 0x7d, 0x0a, 0x12, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, + 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x30, 0x01, 0x12, 0x7d, 0x0a, 0x12, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, - 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x30, 0x01, 0x12, 0x8d, 0x01, 0x0a, 0x18, - 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x44, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, - 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, - 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x0d, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x68, 0x0a, 0x0b, 0x47, - 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, - 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x6f, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, + 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, + 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x30, 0x01, 0x12, 0x8d, 0x01, 0x0a, 0x18, 0x47, + 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x42, 0x79, 0x49, 0x44, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x79, + 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, + 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x0d, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x68, 0x0a, 0x0b, 0x47, 0x65, + 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, - 0x64, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x7a, 0x0a, - 0x11, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x43, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x73, 0x12, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, + 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x6f, 0x0a, 0x0e, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, + 0x92, 0x41, 0x09, 0x0a, 0x07, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x11, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, - 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x30, 0x01, 0x12, 0x7e, 0x0a, 0x13, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, - 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x61, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x43, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x30, 0x01, 0x12, 0x7e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x12, + 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, + 0x07, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x63, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, + 0x56, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x74, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, + 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, + 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x6e, 0x0a, + 0x0c, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, - 0x0a, 0x07, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x63, 0x0a, 0x09, 0x4c, 0x69, 0x73, - 0x74, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x74, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, - 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x6e, - 0x0a, 0x0c, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x24, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x56, 0x6f, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, - 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x30, 0x01, 0x12, 0xb3, - 0x01, 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x42, - 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, - 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, - 0x41, 0x64, 0x64, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, - 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, - 0x69, 0x64, 0x67, 0x65, 0x12, 0xb9, 0x01, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, - 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x3d, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, - 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x42, - 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, + 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x56, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x56, 0x6f, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, + 0x0a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x30, 0x01, 0x12, 0xb3, 0x01, + 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, + 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, + 0x64, 0x64, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, + 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, + 0x64, 0x67, 0x65, 0x12, 0xb9, 0x01, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, + 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x42, 0x75, - 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, - 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, - 0x12, 0x8f, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4c, 0x69, 0x73, - 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x2f, 0x2e, 0x64, + 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, + 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x42, 0x75, 0x6e, + 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, + 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, + 0x8f, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x2f, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, - 0x67, 0x65, 0x12, 0x9e, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x53, - 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x75, 0x6e, - 0x64, 0x6c, 0x65, 0x12, 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x53, 0x65, + 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, + 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, + 0x65, 0x12, 0x9e, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x53, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, - 0x52, 0x43, 0x32, 0x30, 0x53, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x73, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, - 0x64, 0x67, 0x65, 0x12, 0x98, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, + 0x6c, 0x65, 0x12, 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x53, 0x65, 0x74, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x75, 0x6e, 0x64, 0x6c, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, + 0x43, 0x32, 0x30, 0x53, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, + 0x67, 0x65, 0x12, 0x98, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x57, + 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, + 0x6c, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, + 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, - 0x61, 0x6c, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, 0x30, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x52, 0x43, 0x32, - 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x72, 0x6f, - 0x76, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, - 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0x68, - 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x12, 0x24, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, - 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, - 0x0a, 0x06, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, - 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, - 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x0d, - 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x25, 0x2e, + 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, + 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0x68, 0x0a, + 0x0c, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, - 0x61, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, - 0x08, 0x0a, 0x06, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x0d, 0x47, - 0x65, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x25, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, - 0x65, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, + 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, + 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, + 0x06, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, + 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, + 0x92, 0x41, 0x08, 0x0a, 0x06, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x0d, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, - 0x70, 0x65, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, - 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x77, - 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, - 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, - 0x65, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x20, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x74, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x4f, - 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, + 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, + 0x0a, 0x06, 0x54, 0x72, 0x61, 0x64, 0x65, 0x73, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x0d, 0x47, 0x65, + 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x25, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, + 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, + 0x65, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, + 0x0c, 0x44, 0x61, 0x74, 0x61, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x77, 0x0a, + 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x73, + 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, + 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, - 0x0c, 0x44, 0x61, 0x74, 0x61, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x60, 0x0a, - 0x09, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x20, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x74, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, + 0x44, 0x61, 0x74, 0x61, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x60, 0x0a, 0x09, + 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, + 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x66, + 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x47, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, - 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x23, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, - 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, - 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, - 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x5d, 0x0a, 0x08, 0x47, - 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, - 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, - 0x09, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, - 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x12, 0x7e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x12, 0x74, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, - 0x0a, 0x06, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0x7f, 0x0a, 0x13, 0x4f, 0x62, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, - 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, - 0x06, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x30, 0x01, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, + 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x73, 0x12, 0x7e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, + 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x5d, 0x0a, 0x08, 0x47, 0x65, + 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, + 0x0a, 0x07, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, + 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x12, 0x7e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x73, 0x12, 0x8d, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x30, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x12, 0x74, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, + 0x06, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0x7f, 0x0a, 0x13, 0x4f, 0x62, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, - 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x68, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, - 0x6b, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, - 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x71, 0x0a, 0x0f, - 0x4c, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, - 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, - 0x5c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x20, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, + 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x30, 0x01, 0x12, 0x66, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, + 0x12, 0x7e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, + 0x12, 0x8d, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x62, 0x0a, - 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x73, 0x12, 0x8f, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, + 0x12, 0x62, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x22, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x73, 0x12, 0x68, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x6b, + 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x12, + 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, + 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, + 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x71, 0x0a, 0x0f, 0x4c, + 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x27, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x5c, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, + 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x62, 0x0a, 0x0a, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, + 0x12, 0x8f, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x11, 0x88, 0x02, 0x01, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x12, 0x95, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4c, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x11, 0x88, 0x02, 0x01, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x12, 0x95, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4c, 0x69, 0x71, 0x75, - 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, - 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, - 0x0a, 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x97, 0x01, 0x0a, 0x1a, + 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, + 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x97, 0x01, 0x0a, 0x1a, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x30, 0x01, 0x12, 0x89, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x12, 0x86, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x69, 0x64, 0x4c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x50, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, - 0x65, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x64, 0x61, 0x74, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x30, 0x01, 0x12, 0x89, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, + 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, + 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, + 0x12, 0x86, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, + 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, - 0x09, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x7b, 0x0a, 0x11, 0x47, 0x65, - 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, - 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, - 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, - 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x7e, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x47, - 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, - 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x7d, 0x0a, 0x11, 0x4f, 0x62, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, - 0x61, 0x6e, 0x63, 0x65, 0x30, 0x01, 0x12, 0x72, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, - 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, - 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x6f, 0x0a, 0x0e, 0x47, 0x65, - 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, - 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, - 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x5a, 0x0a, 0x07, 0x47, - 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x50, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, + 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x7b, 0x0a, 0x11, 0x47, 0x65, 0x74, + 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x29, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x47, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, + 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x7e, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, + 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x7d, 0x0a, 0x11, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0f, 0x92, 0x41, 0x0c, 0x0a, 0x0a, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x30, 0x01, 0x12, 0x72, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x6c, + 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, + 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x6f, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, + 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, + 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x5a, 0x0a, 0x07, 0x47, 0x65, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, - 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x80, 0x01, 0x0a, 0x12, 0x4c, 0x69, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x60, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, + 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x80, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, + 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, - 0x45, 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0x5d, 0x0a, 0x08, - 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, - 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x65, 0x0a, 0x0b, 0x45, - 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, - 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x71, 0x0a, 0x0e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4d, 0x61, - 0x72, 0x67, 0x69, 0x6e, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4d, - 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, - 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x88, 0x02, 0x01, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x77, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, - 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x92, 0x41, 0x0e, 0x0a, 0x0c, 0x45, + 0x52, 0x43, 0x32, 0x30, 0x20, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0x5d, 0x0a, 0x08, 0x47, + 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, + 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x65, 0x0a, 0x0b, 0x45, 0x73, + 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, - 0x6d, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, - 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x84, - 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x71, 0x0a, 0x0e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, + 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x88, 0x02, 0x01, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x77, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, + 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, + 0x41, 0x0b, 0x0a, 0x09, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x84, 0x01, + 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x7e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x2b, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, - 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x72, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, - 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x5d, 0x0a, 0x08, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, - 0x6b, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, - 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x6f, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x52, - 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, - 0x52, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, - 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x75, 0x0a, 0x0f, 0x4f, 0x62, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x73, 0x12, 0x27, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x28, 0x01, 0x30, 0x01, - 0x12, 0x92, 0x01, 0x0a, 0x16, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x65, 0x64, 0x67, - 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2e, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, - 0x12, 0x0a, 0x10, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x30, 0x01, 0x12, 0x75, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4b, 0x65, 0x79, - 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, - 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x8d, 0x01, 0x0a, - 0x18, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, - 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, - 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x66, 0x0a, 0x0b, - 0x47, 0x65, 0x74, 0x56, 0x65, 0x67, 0x61, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, - 0x74, 0x56, 0x65, 0x67, 0x61, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x67, 0x61, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x8d, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, - 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x7e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x2b, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, + 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x99, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x12, 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x72, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, + 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x5d, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, + 0x74, 0x61, 0x6b, 0x65, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6b, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x6f, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x52, 0x69, + 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, + 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x75, 0x0a, 0x0f, 0x4f, 0x62, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x42, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, + 0x92, 0x41, 0x08, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x28, 0x01, 0x30, 0x01, 0x12, + 0x92, 0x01, 0x0a, 0x16, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4c, 0x65, 0x64, 0x67, 0x65, + 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, + 0x0a, 0x10, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x30, 0x01, 0x12, 0x75, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x52, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4b, + 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, + 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x8d, 0x01, 0x0a, 0x18, + 0x4c, 0x69, 0x73, 0x74, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, + 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x66, 0x0a, 0x0b, 0x47, + 0x65, 0x74, 0x56, 0x65, 0x67, 0x61, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, + 0x56, 0x65, 0x67, 0x61, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x67, 0x61, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x12, 0x8d, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x12, 0x99, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x12, 0x78, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, - 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0xb3, 0x01, 0x0a, 0x22, 0x47, + 0x73, 0x61, 0x6c, 0x73, 0x12, 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, + 0x78, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, + 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0xb3, 0x01, 0x0a, 0x22, 0x47, 0x65, + 0x74, 0x4d, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x3a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x3a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x6e, - 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, + 0xa4, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x35, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x6c, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0xb9, 0x01, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, + 0x3c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, - 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x12, 0xa4, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x35, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x6c, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, - 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0xb9, 0x01, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x12, 0x3c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, + 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x92, 0x41, + 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x92, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x50, 0x65, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x92, - 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x92, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0xaa, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x6f, - 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x65, 0x65, 0x72, 0x73, 0x12, 0x37, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, - 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, - 0x61, 0x70, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x6a, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0x45, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, - 0x72, 0x12, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x96, - 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x33, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x7e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x46, - 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x90, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6b, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x99, 0x01, 0x0a, 0x19, 0x47, - 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, - 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, + 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, + 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0xaa, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x6f, 0x6f, + 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x65, 0x65, 0x72, 0x73, 0x12, 0x37, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x7e, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, + 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, + 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, + 0x70, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, + 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x6a, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x93, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x65, 0x73, 0x12, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, - 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x87, 0x01, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, - 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x5e, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, - 0x61, 0x6d, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, - 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, - 0x05, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x7c, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, - 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2b, 0x2e, + 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0d, 0x92, 0x41, 0x0a, 0x0a, 0x08, 0x45, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, + 0x12, 0x7b, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x12, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x96, 0x01, + 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x33, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x7e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x54, - 0x65, 0x61, 0x6d, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, - 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, - 0x63, 0x73, 0x12, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, - 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x73, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, - 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x74, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x90, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6b, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, + 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x99, 0x01, 0x0a, 0x19, 0x47, 0x65, + 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, + 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x7e, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, - 0x92, 0x41, 0x07, 0x0a, 0x05, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x16, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, + 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x93, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, + 0x73, 0x12, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, + 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x87, 0x01, 0x0a, 0x13, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, + 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, + 0x92, 0x41, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x20, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x5e, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x54, 0x65, 0x61, - 0x6d, 0x73, 0x12, 0x66, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, - 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x09, 0x92, 0x41, 0x06, 0x0a, 0x04, 0x46, 0x65, 0x65, 0x73, 0x12, 0x7e, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, - 0x74, 0x79, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, - 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x09, 0x92, 0x41, 0x06, 0x0a, 0x04, 0x46, 0x65, 0x65, 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x1f, 0x47, - 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x37, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x1c, 0x92, 0x41, 0x19, 0x0a, 0x17, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x64, - 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, - 0x97, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x92, 0x41, 0x19, - 0x0a, 0x17, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x90, 0x01, 0x0a, 0x19, 0x47, 0x65, - 0x74, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, - 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, - 0x92, 0x41, 0x09, 0x0a, 0x07, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x81, 0x01, 0x0a, - 0x14, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, - 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x12, 0x9e, 0x01, 0x0a, 0x19, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x92, 0x41, 0x15, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x30, - 0x01, 0x12, 0x80, 0x01, 0x0a, 0x13, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, - 0x6d, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, - 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, - 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, - 0x5e, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x64, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, + 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x7c, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x12, - 0x80, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, - 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4d, 0x61, 0x72, 0x67, - 0x69, 0x6e, 0x12, 0xa4, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x38, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, - 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x72, 0x0a, 0x14, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, + 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x54, 0x65, + 0x61, 0x6d, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, + 0x73, 0x12, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x54, + 0x65, 0x61, 0x6d, 0x73, 0x12, 0x73, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, + 0x41, 0x07, 0x0a, 0x05, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x16, 0x4c, 0x69, + 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x54, 0x65, 0x61, 0x6d, + 0x73, 0x12, 0x66, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, + 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x09, + 0x92, 0x41, 0x06, 0x0a, 0x04, 0x46, 0x65, 0x65, 0x73, 0x12, 0x7e, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, - 0x70, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x30, 0x01, 0x12, 0x4e, 0x0a, - 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x09, 0x92, 0x41, 0x06, 0x0a, 0x04, 0x4d, 0x69, 0x73, 0x63, 0x42, 0xca, 0x01, - 0x5a, 0x31, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x32, 0x92, 0x41, 0x93, 0x01, 0x12, 0x22, 0x0a, 0x13, 0x56, 0x65, 0x67, 0x61, 0x20, - 0x64, 0x61, 0x74, 0x61, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x32, 0x0b, - 0x76, 0x30, 0x2e, 0x37, 0x36, 0x2e, 0x30, 0x2d, 0x64, 0x65, 0x76, 0x1a, 0x1c, 0x68, 0x74, 0x74, - 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x6e, 0x65, 0x74, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x78, 0x79, 0x7a, 0x2a, 0x02, 0x01, 0x02, 0x32, 0x10, 0x61, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x52, - 0x39, 0x0a, 0x03, 0x35, 0x30, 0x30, 0x12, 0x32, 0x0a, 0x18, 0x41, 0x6e, 0x20, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, + 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, + 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x09, + 0x92, 0x41, 0x06, 0x0a, 0x04, 0x46, 0x65, 0x65, 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x1f, 0x47, 0x65, + 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x37, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x1c, 0x92, 0x41, 0x19, 0x0a, 0x17, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x64, 0x69, + 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x97, + 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x92, 0x41, 0x19, 0x0a, + 0x17, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x90, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x56, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x53, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, + 0x41, 0x09, 0x0a, 0x07, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x81, 0x01, 0x0a, 0x14, + 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, + 0x9e, 0x01, 0x0a, 0x19, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x92, 0x41, 0x15, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x30, 0x01, + 0x12, 0x80, 0x01, 0x0a, 0x13, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x12, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, + 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x33, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, + 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x5e, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x80, + 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, + 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0x4d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x12, 0xa4, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x57, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, + 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x92, 0x41, 0x0b, 0x0a, 0x09, 0x50, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x69, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x4d, 0x4d, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x4d, 0x4d, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x4d, 0x4d, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x92, 0x41, 0x09, 0x0a, 0x07, 0x41, 0x4d, 0x4d, 0x50, + 0x6f, 0x6f, 0x6c, 0x12, 0x72, 0x0a, 0x14, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2c, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x22, + 0x14, 0x92, 0x41, 0x11, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, + 0x1c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x09, 0x92, 0x41, + 0x06, 0x0a, 0x04, 0x4d, 0x69, 0x73, 0x63, 0x42, 0xca, 0x01, 0x5a, 0x31, 0x63, 0x6f, 0x64, 0x65, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, + 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x64, 0x61, 0x74, + 0x61, 0x2d, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x92, 0x41, 0x93, + 0x01, 0x12, 0x22, 0x0a, 0x13, 0x56, 0x65, 0x67, 0x61, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x32, 0x0b, 0x76, 0x30, 0x2e, 0x37, 0x36, 0x2e, + 0x30, 0x2d, 0x64, 0x65, 0x76, 0x1a, 0x1c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x61, + 0x70, 0x69, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x78, 0x79, 0x7a, 0x2a, 0x02, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x52, 0x39, 0x0a, 0x03, 0x35, 0x30, 0x30, + 0x12, 0x32, 0x0a, 0x18, 0x41, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x14, + 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -30562,7 +30867,7 @@ func file_data_node_api_v2_trading_data_proto_rawDescGZIP() []byte { } var file_data_node_api_v2_trading_data_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_data_node_api_v2_trading_data_proto_msgTypes = make([]protoimpl.MessageInfo, 413) +var file_data_node_api_v2_trading_data_proto_msgTypes = make([]protoimpl.MessageInfo, 417) var file_data_node_api_v2_trading_data_proto_goTypes = []interface{}{ (LedgerEntryField)(0), // 0: datanode.api.v2.LedgerEntryField (AccountField)(0), // 1: datanode.api.v2.AccountField @@ -30983,103 +31288,109 @@ var file_data_node_api_v2_trading_data_proto_goTypes = []interface{}{ (*TimeWeightedNotionalPosition)(nil), // 416: datanode.api.v2.TimeWeightedNotionalPosition (*GetTimeWeightedNotionalPositionRequest)(nil), // 417: datanode.api.v2.GetTimeWeightedNotionalPositionRequest (*GetTimeWeightedNotionalPositionResponse)(nil), // 418: datanode.api.v2.GetTimeWeightedNotionalPositionResponse - (*v1.PartyLockedBalance)(nil), // 419: vega.events.v1.PartyLockedBalance - (*v1.PartyVestingBalance)(nil), // 420: vega.events.v1.PartyVestingBalance - (vega.AccountType)(0), // 421: vega.AccountType - (*vega.Order)(nil), // 422: vega.Order - (vega.Order_Status)(0), // 423: vega.Order.Status - (vega.Order_Type)(0), // 424: vega.Order.Type - (vega.Order_TimeInForce)(0), // 425: vega.Order.TimeInForce - (*v1.StopOrderEvent)(nil), // 426: vega.events.v1.StopOrderEvent - (vega.StopOrder_Status)(0), // 427: vega.StopOrder.Status - (vega.StopOrder_ExpiryStrategy)(0), // 428: vega.StopOrder.ExpiryStrategy - (*vega.Position)(nil), // 429: vega.Position - (vega.TransferType)(0), // 430: vega.TransferType - (*vega.MarketDepth)(nil), // 431: vega.MarketDepth - (*vega.MarketDepthUpdate)(nil), // 432: vega.MarketDepthUpdate - (*vega.MarketData)(nil), // 433: vega.MarketData - (*vega.PriceLevel)(nil), // 434: vega.PriceLevel - (*vega.Trade)(nil), // 435: vega.Trade - (v1.Transfer_Status)(0), // 436: vega.events.v1.Transfer.Status - (*v1.Transfer)(nil), // 437: vega.events.v1.Transfer - (*v1.TransferFees)(nil), // 438: vega.events.v1.TransferFees - (*vega.NetworkLimits)(nil), // 439: vega.NetworkLimits - (*vega.Vote)(nil), // 440: vega.Vote - (*v1.ERC20MultiSigSignerAdded)(nil), // 441: vega.events.v1.ERC20MultiSigSignerAdded - (*v1.ERC20MultiSigSignerRemoved)(nil), // 442: vega.events.v1.ERC20MultiSigSignerRemoved - (*vega.OracleSpec)(nil), // 443: vega.OracleSpec - (*vega.OracleData)(nil), // 444: vega.OracleData - (*vega.Market)(nil), // 445: vega.Market - (*vega.GovernanceData)(nil), // 446: vega.GovernanceData - (*vega.Party)(nil), // 447: vega.Party - (*vega.PartyProfile)(nil), // 448: vega.PartyProfile - (*vega.MarginLevels)(nil), // 449: vega.MarginLevels - (*vega.Reward)(nil), // 450: vega.Reward - (*vega.RewardSummary)(nil), // 451: vega.RewardSummary - (*vega.EpochRewardSummary)(nil), // 452: vega.EpochRewardSummary - (*vega.Deposit)(nil), // 453: vega.Deposit - (*vega.Withdrawal)(nil), // 454: vega.Withdrawal - (*vega.Asset)(nil), // 455: vega.Asset - (*vega.LiquidityProvision)(nil), // 456: vega.LiquidityProvision - (*vega.LiquidityProviderFeeShare)(nil), // 457: vega.LiquidityProviderFeeShare - (*vega.LiquidityProviderSLA)(nil), // 458: vega.LiquidityProviderSLA - (*v1.PaidLiquidityFeesStats)(nil), // 459: vega.events.v1.PaidLiquidityFeesStats - (vega.Proposal_State)(0), // 460: vega.Proposal.State - (*vega.Delegation)(nil), // 461: vega.Delegation - (vega.NodeStatus)(0), // 462: vega.NodeStatus - (*vega.NodeData)(nil), // 463: vega.NodeData - (*vega.Node)(nil), // 464: vega.Node - (*v11.NodeSignature)(nil), // 465: vega.commands.v1.NodeSignature - (*vega.Epoch)(nil), // 466: vega.Epoch - (*vega.Fee)(nil), // 467: vega.Fee - (vega.Side)(0), // 468: vega.Side - (*vega.NetworkParameter)(nil), // 469: vega.NetworkParameter - (*v1.StakeLinking)(nil), // 470: vega.events.v1.StakeLinking - (*vega.RiskFactor)(nil), // 471: vega.RiskFactor - (v1.BusEventType)(0), // 472: vega.events.v1.BusEventType - (*v1.BusEvent)(nil), // 473: vega.events.v1.BusEvent - (*vega.LedgerMovement)(nil), // 474: vega.LedgerMovement - (*v1.KeyRotation)(nil), // 475: vega.events.v1.KeyRotation - (*v1.EthereumKeyRotation)(nil), // 476: vega.events.v1.EthereumKeyRotation - (v1.ProtocolUpgradeProposalStatus)(0), // 477: vega.events.v1.ProtocolUpgradeProposalStatus - (*v1.ProtocolUpgradeEvent)(nil), // 478: vega.events.v1.ProtocolUpgradeEvent - (*v1.CoreSnapshotData)(nil), // 479: vega.events.v1.CoreSnapshotData - (*vega.Account)(nil), // 480: vega.Account - (*vega.LedgerEntry)(nil), // 481: vega.LedgerEntry - (*vega.Proposal)(nil), // 482: vega.Proposal - (*v1.PartyActivityStreak)(nil), // 483: vega.events.v1.PartyActivityStreak - (*v1.FundingPeriod)(nil), // 484: vega.events.v1.FundingPeriod - (v1.FundingPeriodDataPoint_Source)(0), // 485: vega.events.v1.FundingPeriodDataPoint.Source - (*v1.FundingPeriodDataPoint)(nil), // 486: vega.events.v1.FundingPeriodDataPoint - (vega.MarginMode)(0), // 487: vega.MarginMode - (*vega.BenefitTier)(nil), // 488: vega.BenefitTier - (*vega.StakingTier)(nil), // 489: vega.StakingTier - (*v1.FeesStats)(nil), // 490: vega.events.v1.FeesStats - (*vega.VolumeBenefitTier)(nil), // 491: vega.VolumeBenefitTier - (*v1.TransactionResult)(nil), // 492: vega.events.v1.TransactionResult - (vega.EntityScope)(0), // 493: vega.EntityScope - (vega.DispatchMetric)(0), // 494: vega.DispatchMetric - (*httpbody.HttpBody)(nil), // 495: google.api.HttpBody + (*ListAMMPoolsRequest)(nil), // 419: datanode.api.v2.ListAMMPoolsRequest + (*ListAMMPoolsResponse)(nil), // 420: datanode.api.v2.ListAMMPoolsResponse + (*AMMPoolsConnection)(nil), // 421: datanode.api.v2.AMMPoolsConnection + (*AMMPoolEdge)(nil), // 422: datanode.api.v2.AMMPoolEdge + (*v1.PartyLockedBalance)(nil), // 423: vega.events.v1.PartyLockedBalance + (*v1.PartyVestingBalance)(nil), // 424: vega.events.v1.PartyVestingBalance + (vega.AccountType)(0), // 425: vega.AccountType + (*vega.Order)(nil), // 426: vega.Order + (vega.Order_Status)(0), // 427: vega.Order.Status + (vega.Order_Type)(0), // 428: vega.Order.Type + (vega.Order_TimeInForce)(0), // 429: vega.Order.TimeInForce + (*v1.StopOrderEvent)(nil), // 430: vega.events.v1.StopOrderEvent + (vega.StopOrder_Status)(0), // 431: vega.StopOrder.Status + (vega.StopOrder_ExpiryStrategy)(0), // 432: vega.StopOrder.ExpiryStrategy + (*vega.Position)(nil), // 433: vega.Position + (vega.TransferType)(0), // 434: vega.TransferType + (*vega.MarketDepth)(nil), // 435: vega.MarketDepth + (*vega.MarketDepthUpdate)(nil), // 436: vega.MarketDepthUpdate + (*vega.MarketData)(nil), // 437: vega.MarketData + (*vega.PriceLevel)(nil), // 438: vega.PriceLevel + (*vega.Trade)(nil), // 439: vega.Trade + (v1.Transfer_Status)(0), // 440: vega.events.v1.Transfer.Status + (*v1.Transfer)(nil), // 441: vega.events.v1.Transfer + (*v1.TransferFees)(nil), // 442: vega.events.v1.TransferFees + (*vega.NetworkLimits)(nil), // 443: vega.NetworkLimits + (*vega.Vote)(nil), // 444: vega.Vote + (*v1.ERC20MultiSigSignerAdded)(nil), // 445: vega.events.v1.ERC20MultiSigSignerAdded + (*v1.ERC20MultiSigSignerRemoved)(nil), // 446: vega.events.v1.ERC20MultiSigSignerRemoved + (*vega.OracleSpec)(nil), // 447: vega.OracleSpec + (*vega.OracleData)(nil), // 448: vega.OracleData + (*vega.Market)(nil), // 449: vega.Market + (*vega.GovernanceData)(nil), // 450: vega.GovernanceData + (*vega.Party)(nil), // 451: vega.Party + (*vega.PartyProfile)(nil), // 452: vega.PartyProfile + (*vega.MarginLevels)(nil), // 453: vega.MarginLevels + (*vega.Reward)(nil), // 454: vega.Reward + (*vega.RewardSummary)(nil), // 455: vega.RewardSummary + (*vega.EpochRewardSummary)(nil), // 456: vega.EpochRewardSummary + (*vega.Deposit)(nil), // 457: vega.Deposit + (*vega.Withdrawal)(nil), // 458: vega.Withdrawal + (*vega.Asset)(nil), // 459: vega.Asset + (*vega.LiquidityProvision)(nil), // 460: vega.LiquidityProvision + (*vega.LiquidityProviderFeeShare)(nil), // 461: vega.LiquidityProviderFeeShare + (*vega.LiquidityProviderSLA)(nil), // 462: vega.LiquidityProviderSLA + (*v1.PaidLiquidityFeesStats)(nil), // 463: vega.events.v1.PaidLiquidityFeesStats + (vega.Proposal_State)(0), // 464: vega.Proposal.State + (*vega.Delegation)(nil), // 465: vega.Delegation + (vega.NodeStatus)(0), // 466: vega.NodeStatus + (*vega.NodeData)(nil), // 467: vega.NodeData + (*vega.Node)(nil), // 468: vega.Node + (*v11.NodeSignature)(nil), // 469: vega.commands.v1.NodeSignature + (*vega.Epoch)(nil), // 470: vega.Epoch + (*vega.Fee)(nil), // 471: vega.Fee + (vega.Side)(0), // 472: vega.Side + (*vega.NetworkParameter)(nil), // 473: vega.NetworkParameter + (*v1.StakeLinking)(nil), // 474: vega.events.v1.StakeLinking + (*vega.RiskFactor)(nil), // 475: vega.RiskFactor + (v1.BusEventType)(0), // 476: vega.events.v1.BusEventType + (*v1.BusEvent)(nil), // 477: vega.events.v1.BusEvent + (*vega.LedgerMovement)(nil), // 478: vega.LedgerMovement + (*v1.KeyRotation)(nil), // 479: vega.events.v1.KeyRotation + (*v1.EthereumKeyRotation)(nil), // 480: vega.events.v1.EthereumKeyRotation + (v1.ProtocolUpgradeProposalStatus)(0), // 481: vega.events.v1.ProtocolUpgradeProposalStatus + (*v1.ProtocolUpgradeEvent)(nil), // 482: vega.events.v1.ProtocolUpgradeEvent + (*v1.CoreSnapshotData)(nil), // 483: vega.events.v1.CoreSnapshotData + (*vega.Account)(nil), // 484: vega.Account + (*vega.LedgerEntry)(nil), // 485: vega.LedgerEntry + (*vega.Proposal)(nil), // 486: vega.Proposal + (*v1.PartyActivityStreak)(nil), // 487: vega.events.v1.PartyActivityStreak + (*v1.FundingPeriod)(nil), // 488: vega.events.v1.FundingPeriod + (v1.FundingPeriodDataPoint_Source)(0), // 489: vega.events.v1.FundingPeriodDataPoint.Source + (*v1.FundingPeriodDataPoint)(nil), // 490: vega.events.v1.FundingPeriodDataPoint + (vega.MarginMode)(0), // 491: vega.MarginMode + (*vega.BenefitTier)(nil), // 492: vega.BenefitTier + (*vega.StakingTier)(nil), // 493: vega.StakingTier + (*v1.FeesStats)(nil), // 494: vega.events.v1.FeesStats + (*vega.VolumeBenefitTier)(nil), // 495: vega.VolumeBenefitTier + (*v1.TransactionResult)(nil), // 496: vega.events.v1.TransactionResult + (vega.EntityScope)(0), // 497: vega.EntityScope + (vega.DispatchMetric)(0), // 498: vega.DispatchMetric + (v1.AMMPool_Status)(0), // 499: vega.events.v1.AMMPool.Status + (*v1.AMMPool)(nil), // 500: vega.events.v1.AMMPool + (*httpbody.HttpBody)(nil), // 501: google.api.HttpBody } var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ - 419, // 0: datanode.api.v2.GetVestingBalancesSummaryResponse.locked_balances:type_name -> vega.events.v1.PartyLockedBalance - 420, // 1: datanode.api.v2.GetVestingBalancesSummaryResponse.vesting_balances:type_name -> vega.events.v1.PartyVestingBalance - 421, // 2: datanode.api.v2.AccountBalance.type:type_name -> vega.AccountType + 423, // 0: datanode.api.v2.GetVestingBalancesSummaryResponse.locked_balances:type_name -> vega.events.v1.PartyLockedBalance + 424, // 1: datanode.api.v2.GetVestingBalancesSummaryResponse.vesting_balances:type_name -> vega.events.v1.PartyVestingBalance + 425, // 2: datanode.api.v2.AccountBalance.type:type_name -> vega.AccountType 65, // 3: datanode.api.v2.ListAccountsRequest.filter:type_name -> datanode.api.v2.AccountFilter 6, // 4: datanode.api.v2.ListAccountsRequest.pagination:type_name -> datanode.api.v2.Pagination 15, // 5: datanode.api.v2.ListAccountsResponse.accounts:type_name -> datanode.api.v2.AccountsConnection 16, // 6: datanode.api.v2.AccountsConnection.edges:type_name -> datanode.api.v2.AccountEdge 7, // 7: datanode.api.v2.AccountsConnection.page_info:type_name -> datanode.api.v2.PageInfo 12, // 8: datanode.api.v2.AccountEdge.node:type_name -> datanode.api.v2.AccountBalance - 421, // 9: datanode.api.v2.ObserveAccountsRequest.type:type_name -> vega.AccountType + 425, // 9: datanode.api.v2.ObserveAccountsRequest.type:type_name -> vega.AccountType 19, // 10: datanode.api.v2.ObserveAccountsResponse.snapshot:type_name -> datanode.api.v2.AccountSnapshotPage 20, // 11: datanode.api.v2.ObserveAccountsResponse.updates:type_name -> datanode.api.v2.AccountUpdates 12, // 12: datanode.api.v2.AccountSnapshotPage.accounts:type_name -> datanode.api.v2.AccountBalance 12, // 13: datanode.api.v2.AccountUpdates.accounts:type_name -> datanode.api.v2.AccountBalance - 422, // 14: datanode.api.v2.GetOrderResponse.order:type_name -> vega.Order - 423, // 15: datanode.api.v2.OrderFilter.statuses:type_name -> vega.Order.Status - 424, // 16: datanode.api.v2.OrderFilter.types:type_name -> vega.Order.Type - 425, // 17: datanode.api.v2.OrderFilter.time_in_forces:type_name -> vega.Order.TimeInForce + 426, // 14: datanode.api.v2.GetOrderResponse.order:type_name -> vega.Order + 427, // 15: datanode.api.v2.OrderFilter.statuses:type_name -> vega.Order.Status + 428, // 16: datanode.api.v2.OrderFilter.types:type_name -> vega.Order.Type + 429, // 17: datanode.api.v2.OrderFilter.time_in_forces:type_name -> vega.Order.TimeInForce 288, // 18: datanode.api.v2.OrderFilter.date_range:type_name -> datanode.api.v2.DateRange 6, // 19: datanode.api.v2.ListOrdersRequest.pagination:type_name -> datanode.api.v2.Pagination 25, // 20: datanode.api.v2.ListOrdersRequest.filter:type_name -> datanode.api.v2.OrderFilter @@ -31088,15 +31399,15 @@ var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ 170, // 23: datanode.api.v2.ListOrderVersionsResponse.orders:type_name -> datanode.api.v2.OrderConnection 32, // 24: datanode.api.v2.ObserveOrdersResponse.snapshot:type_name -> datanode.api.v2.OrderSnapshotPage 33, // 25: datanode.api.v2.ObserveOrdersResponse.updates:type_name -> datanode.api.v2.OrderUpdates - 422, // 26: datanode.api.v2.OrderSnapshotPage.orders:type_name -> vega.Order - 422, // 27: datanode.api.v2.OrderUpdates.orders:type_name -> vega.Order - 426, // 28: datanode.api.v2.GetStopOrderResponse.order:type_name -> vega.events.v1.StopOrderEvent + 426, // 26: datanode.api.v2.OrderSnapshotPage.orders:type_name -> vega.Order + 426, // 27: datanode.api.v2.OrderUpdates.orders:type_name -> vega.Order + 430, // 28: datanode.api.v2.GetStopOrderResponse.order:type_name -> vega.events.v1.StopOrderEvent 6, // 29: datanode.api.v2.ListStopOrdersRequest.pagination:type_name -> datanode.api.v2.Pagination 37, // 30: datanode.api.v2.ListStopOrdersRequest.filter:type_name -> datanode.api.v2.StopOrderFilter - 427, // 31: datanode.api.v2.StopOrderFilter.statuses:type_name -> vega.StopOrder.Status - 428, // 32: datanode.api.v2.StopOrderFilter.expiry_strategies:type_name -> vega.StopOrder.ExpiryStrategy + 431, // 31: datanode.api.v2.StopOrderFilter.statuses:type_name -> vega.StopOrder.Status + 432, // 32: datanode.api.v2.StopOrderFilter.expiry_strategies:type_name -> vega.StopOrder.ExpiryStrategy 288, // 33: datanode.api.v2.StopOrderFilter.date_range:type_name -> datanode.api.v2.DateRange - 426, // 34: datanode.api.v2.StopOrderEdge.node:type_name -> vega.events.v1.StopOrderEvent + 430, // 34: datanode.api.v2.StopOrderEdge.node:type_name -> vega.events.v1.StopOrderEvent 38, // 35: datanode.api.v2.StopOrderConnection.edges:type_name -> datanode.api.v2.StopOrderEdge 7, // 36: datanode.api.v2.StopOrderConnection.page_info:type_name -> datanode.api.v2.PageInfo 39, // 37: datanode.api.v2.ListStopOrdersResponse.orders:type_name -> datanode.api.v2.StopOrderConnection @@ -31105,19 +31416,19 @@ var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ 43, // 40: datanode.api.v2.ListAllPositionsRequest.filter:type_name -> datanode.api.v2.PositionsFilter 6, // 41: datanode.api.v2.ListAllPositionsRequest.pagination:type_name -> datanode.api.v2.Pagination 47, // 42: datanode.api.v2.ListAllPositionsResponse.positions:type_name -> datanode.api.v2.PositionConnection - 429, // 43: datanode.api.v2.PositionEdge.node:type_name -> vega.Position + 433, // 43: datanode.api.v2.PositionEdge.node:type_name -> vega.Position 46, // 44: datanode.api.v2.PositionConnection.edges:type_name -> datanode.api.v2.PositionEdge 7, // 45: datanode.api.v2.PositionConnection.page_info:type_name -> datanode.api.v2.PageInfo 50, // 46: datanode.api.v2.ObservePositionsResponse.snapshot:type_name -> datanode.api.v2.PositionSnapshotPage 51, // 47: datanode.api.v2.ObservePositionsResponse.updates:type_name -> datanode.api.v2.PositionUpdates - 429, // 48: datanode.api.v2.PositionSnapshotPage.positions:type_name -> vega.Position - 429, // 49: datanode.api.v2.PositionUpdates.positions:type_name -> vega.Position + 433, // 48: datanode.api.v2.PositionSnapshotPage.positions:type_name -> vega.Position + 433, // 49: datanode.api.v2.PositionUpdates.positions:type_name -> vega.Position 65, // 50: datanode.api.v2.LedgerEntryFilter.from_account_filter:type_name -> datanode.api.v2.AccountFilter 65, // 51: datanode.api.v2.LedgerEntryFilter.to_account_filter:type_name -> datanode.api.v2.AccountFilter - 430, // 52: datanode.api.v2.LedgerEntryFilter.transfer_types:type_name -> vega.TransferType - 430, // 53: datanode.api.v2.AggregatedLedgerEntry.transfer_type:type_name -> vega.TransferType - 421, // 54: datanode.api.v2.AggregatedLedgerEntry.from_account_type:type_name -> vega.AccountType - 421, // 55: datanode.api.v2.AggregatedLedgerEntry.to_account_type:type_name -> vega.AccountType + 434, // 52: datanode.api.v2.LedgerEntryFilter.transfer_types:type_name -> vega.TransferType + 434, // 53: datanode.api.v2.AggregatedLedgerEntry.transfer_type:type_name -> vega.TransferType + 425, // 54: datanode.api.v2.AggregatedLedgerEntry.from_account_type:type_name -> vega.AccountType + 425, // 55: datanode.api.v2.AggregatedLedgerEntry.to_account_type:type_name -> vega.AccountType 52, // 56: datanode.api.v2.ListLedgerEntriesRequest.filter:type_name -> datanode.api.v2.LedgerEntryFilter 6, // 57: datanode.api.v2.ListLedgerEntriesRequest.pagination:type_name -> datanode.api.v2.Pagination 288, // 58: datanode.api.v2.ListLedgerEntriesRequest.date_range:type_name -> datanode.api.v2.DateRange @@ -31138,35 +31449,35 @@ var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ 66, // 73: datanode.api.v2.AggregatedBalanceEdge.node:type_name -> datanode.api.v2.AggregatedBalance 63, // 74: datanode.api.v2.AggregatedBalanceConnection.edges:type_name -> datanode.api.v2.AggregatedBalanceEdge 7, // 75: datanode.api.v2.AggregatedBalanceConnection.page_info:type_name -> datanode.api.v2.PageInfo - 421, // 76: datanode.api.v2.AccountFilter.account_types:type_name -> vega.AccountType - 421, // 77: datanode.api.v2.AggregatedBalance.account_type:type_name -> vega.AccountType - 431, // 78: datanode.api.v2.ObserveMarketsDepthResponse.market_depth:type_name -> vega.MarketDepth - 432, // 79: datanode.api.v2.ObserveMarketsDepthUpdatesResponse.update:type_name -> vega.MarketDepthUpdate - 433, // 80: datanode.api.v2.ObserveMarketsDataResponse.market_data:type_name -> vega.MarketData - 434, // 81: datanode.api.v2.GetLatestMarketDepthResponse.buy:type_name -> vega.PriceLevel - 434, // 82: datanode.api.v2.GetLatestMarketDepthResponse.sell:type_name -> vega.PriceLevel - 435, // 83: datanode.api.v2.GetLatestMarketDepthResponse.last_trade:type_name -> vega.Trade - 433, // 84: datanode.api.v2.ListLatestMarketDataResponse.markets_data:type_name -> vega.MarketData - 433, // 85: datanode.api.v2.GetLatestMarketDataResponse.market_data:type_name -> vega.MarketData + 425, // 76: datanode.api.v2.AccountFilter.account_types:type_name -> vega.AccountType + 425, // 77: datanode.api.v2.AggregatedBalance.account_type:type_name -> vega.AccountType + 435, // 78: datanode.api.v2.ObserveMarketsDepthResponse.market_depth:type_name -> vega.MarketDepth + 436, // 79: datanode.api.v2.ObserveMarketsDepthUpdatesResponse.update:type_name -> vega.MarketDepthUpdate + 437, // 80: datanode.api.v2.ObserveMarketsDataResponse.market_data:type_name -> vega.MarketData + 438, // 81: datanode.api.v2.GetLatestMarketDepthResponse.buy:type_name -> vega.PriceLevel + 438, // 82: datanode.api.v2.GetLatestMarketDepthResponse.sell:type_name -> vega.PriceLevel + 439, // 83: datanode.api.v2.GetLatestMarketDepthResponse.last_trade:type_name -> vega.Trade + 437, // 84: datanode.api.v2.ListLatestMarketDataResponse.markets_data:type_name -> vega.MarketData + 437, // 85: datanode.api.v2.GetLatestMarketDataResponse.market_data:type_name -> vega.MarketData 6, // 86: datanode.api.v2.GetMarketDataHistoryByIDRequest.pagination:type_name -> datanode.api.v2.Pagination 82, // 87: datanode.api.v2.GetMarketDataHistoryByIDResponse.market_data:type_name -> datanode.api.v2.MarketDataConnection - 433, // 88: datanode.api.v2.MarketDataEdge.node:type_name -> vega.MarketData + 437, // 88: datanode.api.v2.MarketDataEdge.node:type_name -> vega.MarketData 81, // 89: datanode.api.v2.MarketDataConnection.edges:type_name -> datanode.api.v2.MarketDataEdge 7, // 90: datanode.api.v2.MarketDataConnection.page_info:type_name -> datanode.api.v2.PageInfo 2, // 91: datanode.api.v2.ListTransfersRequest.direction:type_name -> datanode.api.v2.TransferDirection 6, // 92: datanode.api.v2.ListTransfersRequest.pagination:type_name -> datanode.api.v2.Pagination - 436, // 93: datanode.api.v2.ListTransfersRequest.status:type_name -> vega.events.v1.Transfer.Status + 440, // 93: datanode.api.v2.ListTransfersRequest.status:type_name -> vega.events.v1.Transfer.Status 4, // 94: datanode.api.v2.ListTransfersRequest.scope:type_name -> datanode.api.v2.ListTransfersRequest.Scope - 421, // 95: datanode.api.v2.ListTransfersRequest.from_account_type:type_name -> vega.AccountType - 421, // 96: datanode.api.v2.ListTransfersRequest.to_account_type:type_name -> vega.AccountType + 425, // 95: datanode.api.v2.ListTransfersRequest.from_account_type:type_name -> vega.AccountType + 425, // 96: datanode.api.v2.ListTransfersRequest.to_account_type:type_name -> vega.AccountType 87, // 97: datanode.api.v2.ListTransfersResponse.transfers:type_name -> datanode.api.v2.TransferConnection - 437, // 98: datanode.api.v2.TransferNode.transfer:type_name -> vega.events.v1.Transfer - 438, // 99: datanode.api.v2.TransferNode.fees:type_name -> vega.events.v1.TransferFees + 441, // 98: datanode.api.v2.TransferNode.transfer:type_name -> vega.events.v1.Transfer + 442, // 99: datanode.api.v2.TransferNode.fees:type_name -> vega.events.v1.TransferFees 85, // 100: datanode.api.v2.TransferEdge.node:type_name -> datanode.api.v2.TransferNode 86, // 101: datanode.api.v2.TransferConnection.edges:type_name -> datanode.api.v2.TransferEdge 7, // 102: datanode.api.v2.TransferConnection.page_info:type_name -> datanode.api.v2.PageInfo 85, // 103: datanode.api.v2.GetTransferResponse.transfer_node:type_name -> datanode.api.v2.TransferNode - 439, // 104: datanode.api.v2.GetNetworkLimitsResponse.limits:type_name -> vega.NetworkLimits + 443, // 104: datanode.api.v2.GetNetworkLimitsResponse.limits:type_name -> vega.NetworkLimits 93, // 105: datanode.api.v2.ListCandleIntervalsResponse.interval_to_candle_id:type_name -> datanode.api.v2.IntervalToCandleId 95, // 106: datanode.api.v2.ObserveCandleDataResponse.candle:type_name -> datanode.api.v2.Candle 6, // 107: datanode.api.v2.ListCandleDataRequest.pagination:type_name -> datanode.api.v2.Pagination @@ -31176,170 +31487,170 @@ var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ 7, // 111: datanode.api.v2.CandleDataConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 112: datanode.api.v2.ListVotesRequest.pagination:type_name -> datanode.api.v2.Pagination 105, // 113: datanode.api.v2.ListVotesResponse.votes:type_name -> datanode.api.v2.VoteConnection - 440, // 114: datanode.api.v2.VoteEdge.node:type_name -> vega.Vote + 444, // 114: datanode.api.v2.VoteEdge.node:type_name -> vega.Vote 104, // 115: datanode.api.v2.VoteConnection.edges:type_name -> datanode.api.v2.VoteEdge 7, // 116: datanode.api.v2.VoteConnection.page_info:type_name -> datanode.api.v2.PageInfo - 440, // 117: datanode.api.v2.ObserveVotesResponse.vote:type_name -> vega.Vote + 444, // 117: datanode.api.v2.ObserveVotesResponse.vote:type_name -> vega.Vote 6, // 118: datanode.api.v2.ListERC20MultiSigSignerAddedBundlesRequest.pagination:type_name -> datanode.api.v2.Pagination 112, // 119: datanode.api.v2.ListERC20MultiSigSignerAddedBundlesResponse.bundles:type_name -> datanode.api.v2.ERC20MultiSigSignerAddedConnection - 441, // 120: datanode.api.v2.ERC20MultiSigSignerAddedEdge.node:type_name -> vega.events.v1.ERC20MultiSigSignerAdded + 445, // 120: datanode.api.v2.ERC20MultiSigSignerAddedEdge.node:type_name -> vega.events.v1.ERC20MultiSigSignerAdded 113, // 121: datanode.api.v2.ERC20MultiSigSignerAddedBundleEdge.node:type_name -> datanode.api.v2.ERC20MultiSigSignerAddedBundle 111, // 122: datanode.api.v2.ERC20MultiSigSignerAddedConnection.edges:type_name -> datanode.api.v2.ERC20MultiSigSignerAddedBundleEdge 7, // 123: datanode.api.v2.ERC20MultiSigSignerAddedConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 124: datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesRequest.pagination:type_name -> datanode.api.v2.Pagination 118, // 125: datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesResponse.bundles:type_name -> datanode.api.v2.ERC20MultiSigSignerRemovedConnection - 442, // 126: datanode.api.v2.ERC20MultiSigSignerRemovedEdge.node:type_name -> vega.events.v1.ERC20MultiSigSignerRemoved + 446, // 126: datanode.api.v2.ERC20MultiSigSignerRemovedEdge.node:type_name -> vega.events.v1.ERC20MultiSigSignerRemoved 119, // 127: datanode.api.v2.ERC20MultiSigSignerRemovedBundleEdge.node:type_name -> datanode.api.v2.ERC20MultiSigSignerRemovedBundle 117, // 128: datanode.api.v2.ERC20MultiSigSignerRemovedConnection.edges:type_name -> datanode.api.v2.ERC20MultiSigSignerRemovedBundleEdge 7, // 129: datanode.api.v2.ERC20MultiSigSignerRemovedConnection.page_info:type_name -> datanode.api.v2.PageInfo - 435, // 130: datanode.api.v2.GetLastTradeResponse.trade:type_name -> vega.Trade + 439, // 130: datanode.api.v2.GetLastTradeResponse.trade:type_name -> vega.Trade 6, // 131: datanode.api.v2.ListTradesRequest.pagination:type_name -> datanode.api.v2.Pagination 288, // 132: datanode.api.v2.ListTradesRequest.date_range:type_name -> datanode.api.v2.DateRange 130, // 133: datanode.api.v2.ListTradesResponse.trades:type_name -> datanode.api.v2.TradeConnection 131, // 134: datanode.api.v2.TradeConnection.edges:type_name -> datanode.api.v2.TradeEdge 7, // 135: datanode.api.v2.TradeConnection.page_info:type_name -> datanode.api.v2.PageInfo - 435, // 136: datanode.api.v2.TradeEdge.node:type_name -> vega.Trade - 435, // 137: datanode.api.v2.ObserveTradesResponse.trades:type_name -> vega.Trade - 443, // 138: datanode.api.v2.GetOracleSpecResponse.oracle_spec:type_name -> vega.OracleSpec + 439, // 136: datanode.api.v2.TradeEdge.node:type_name -> vega.Trade + 439, // 137: datanode.api.v2.ObserveTradesResponse.trades:type_name -> vega.Trade + 447, // 138: datanode.api.v2.GetOracleSpecResponse.oracle_spec:type_name -> vega.OracleSpec 6, // 139: datanode.api.v2.ListOracleSpecsRequest.pagination:type_name -> datanode.api.v2.Pagination 141, // 140: datanode.api.v2.ListOracleSpecsResponse.oracle_specs:type_name -> datanode.api.v2.OracleSpecsConnection 6, // 141: datanode.api.v2.ListOracleDataRequest.pagination:type_name -> datanode.api.v2.Pagination 143, // 142: datanode.api.v2.ListOracleDataResponse.oracle_data:type_name -> datanode.api.v2.OracleDataConnection - 443, // 143: datanode.api.v2.OracleSpecEdge.node:type_name -> vega.OracleSpec + 447, // 143: datanode.api.v2.OracleSpecEdge.node:type_name -> vega.OracleSpec 140, // 144: datanode.api.v2.OracleSpecsConnection.edges:type_name -> datanode.api.v2.OracleSpecEdge 7, // 145: datanode.api.v2.OracleSpecsConnection.page_info:type_name -> datanode.api.v2.PageInfo - 444, // 146: datanode.api.v2.OracleDataEdge.node:type_name -> vega.OracleData + 448, // 146: datanode.api.v2.OracleDataEdge.node:type_name -> vega.OracleData 142, // 147: datanode.api.v2.OracleDataConnection.edges:type_name -> datanode.api.v2.OracleDataEdge 7, // 148: datanode.api.v2.OracleDataConnection.page_info:type_name -> datanode.api.v2.PageInfo - 445, // 149: datanode.api.v2.GetMarketResponse.market:type_name -> vega.Market + 449, // 149: datanode.api.v2.GetMarketResponse.market:type_name -> vega.Market 6, // 150: datanode.api.v2.ListMarketsRequest.pagination:type_name -> datanode.api.v2.Pagination 149, // 151: datanode.api.v2.ListMarketsResponse.markets:type_name -> datanode.api.v2.MarketConnection - 445, // 152: datanode.api.v2.MarketEdge.node:type_name -> vega.Market + 449, // 152: datanode.api.v2.MarketEdge.node:type_name -> vega.Market 148, // 153: datanode.api.v2.MarketConnection.edges:type_name -> datanode.api.v2.MarketEdge 7, // 154: datanode.api.v2.MarketConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 155: datanode.api.v2.ListSuccessorMarketsRequest.pagination:type_name -> datanode.api.v2.Pagination - 445, // 156: datanode.api.v2.SuccessorMarket.market:type_name -> vega.Market - 446, // 157: datanode.api.v2.SuccessorMarket.proposals:type_name -> vega.GovernanceData + 449, // 156: datanode.api.v2.SuccessorMarket.market:type_name -> vega.Market + 450, // 157: datanode.api.v2.SuccessorMarket.proposals:type_name -> vega.GovernanceData 151, // 158: datanode.api.v2.SuccessorMarketEdge.node:type_name -> datanode.api.v2.SuccessorMarket 152, // 159: datanode.api.v2.SuccessorMarketConnection.edges:type_name -> datanode.api.v2.SuccessorMarketEdge 7, // 160: datanode.api.v2.SuccessorMarketConnection.page_info:type_name -> datanode.api.v2.PageInfo 153, // 161: datanode.api.v2.ListSuccessorMarketsResponse.successor_markets:type_name -> datanode.api.v2.SuccessorMarketConnection - 447, // 162: datanode.api.v2.GetPartyResponse.party:type_name -> vega.Party + 451, // 162: datanode.api.v2.GetPartyResponse.party:type_name -> vega.Party 6, // 163: datanode.api.v2.ListPartiesRequest.pagination:type_name -> datanode.api.v2.Pagination 160, // 164: datanode.api.v2.ListPartiesResponse.parties:type_name -> datanode.api.v2.PartyConnection - 447, // 165: datanode.api.v2.PartyEdge.node:type_name -> vega.Party + 451, // 165: datanode.api.v2.PartyEdge.node:type_name -> vega.Party 159, // 166: datanode.api.v2.PartyConnection.edges:type_name -> datanode.api.v2.PartyEdge 7, // 167: datanode.api.v2.PartyConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 168: datanode.api.v2.ListPartiesProfilesRequest.pagination:type_name -> datanode.api.v2.Pagination 164, // 169: datanode.api.v2.ListPartiesProfilesResponse.profiles:type_name -> datanode.api.v2.PartiesProfilesConnection - 448, // 170: datanode.api.v2.PartyProfileEdge.node:type_name -> vega.PartyProfile + 452, // 170: datanode.api.v2.PartyProfileEdge.node:type_name -> vega.PartyProfile 163, // 171: datanode.api.v2.PartiesProfilesConnection.edges:type_name -> datanode.api.v2.PartyProfileEdge 7, // 172: datanode.api.v2.PartiesProfilesConnection.page_info:type_name -> datanode.api.v2.PageInfo - 422, // 173: datanode.api.v2.OrderEdge.node:type_name -> vega.Order + 426, // 173: datanode.api.v2.OrderEdge.node:type_name -> vega.Order 6, // 174: datanode.api.v2.ListMarginLevelsRequest.pagination:type_name -> datanode.api.v2.Pagination 172, // 175: datanode.api.v2.ListMarginLevelsResponse.margin_levels:type_name -> datanode.api.v2.MarginConnection - 449, // 176: datanode.api.v2.ObserveMarginLevelsResponse.margin_levels:type_name -> vega.MarginLevels + 453, // 176: datanode.api.v2.ObserveMarginLevelsResponse.margin_levels:type_name -> vega.MarginLevels 165, // 177: datanode.api.v2.OrderConnection.edges:type_name -> datanode.api.v2.OrderEdge 7, // 178: datanode.api.v2.OrderConnection.page_info:type_name -> datanode.api.v2.PageInfo - 449, // 179: datanode.api.v2.MarginEdge.node:type_name -> vega.MarginLevels + 453, // 179: datanode.api.v2.MarginEdge.node:type_name -> vega.MarginLevels 171, // 180: datanode.api.v2.MarginConnection.edges:type_name -> datanode.api.v2.MarginEdge 7, // 181: datanode.api.v2.MarginConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 182: datanode.api.v2.ListRewardsRequest.pagination:type_name -> datanode.api.v2.Pagination 176, // 183: datanode.api.v2.ListRewardsResponse.rewards:type_name -> datanode.api.v2.RewardsConnection - 450, // 184: datanode.api.v2.RewardEdge.node:type_name -> vega.Reward + 454, // 184: datanode.api.v2.RewardEdge.node:type_name -> vega.Reward 175, // 185: datanode.api.v2.RewardsConnection.edges:type_name -> datanode.api.v2.RewardEdge 7, // 186: datanode.api.v2.RewardsConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 187: datanode.api.v2.ListRewardSummariesRequest.pagination:type_name -> datanode.api.v2.Pagination - 451, // 188: datanode.api.v2.ListRewardSummariesResponse.summaries:type_name -> vega.RewardSummary + 455, // 188: datanode.api.v2.ListRewardSummariesResponse.summaries:type_name -> vega.RewardSummary 179, // 189: datanode.api.v2.ListEpochRewardSummariesRequest.filter:type_name -> datanode.api.v2.RewardSummaryFilter 6, // 190: datanode.api.v2.ListEpochRewardSummariesRequest.pagination:type_name -> datanode.api.v2.Pagination 182, // 191: datanode.api.v2.ListEpochRewardSummariesResponse.summaries:type_name -> datanode.api.v2.EpochRewardSummaryConnection 183, // 192: datanode.api.v2.EpochRewardSummaryConnection.edges:type_name -> datanode.api.v2.EpochRewardSummaryEdge 7, // 193: datanode.api.v2.EpochRewardSummaryConnection.page_info:type_name -> datanode.api.v2.PageInfo - 452, // 194: datanode.api.v2.EpochRewardSummaryEdge.node:type_name -> vega.EpochRewardSummary - 450, // 195: datanode.api.v2.ObserveRewardsResponse.reward:type_name -> vega.Reward - 453, // 196: datanode.api.v2.GetDepositResponse.deposit:type_name -> vega.Deposit + 456, // 194: datanode.api.v2.EpochRewardSummaryEdge.node:type_name -> vega.EpochRewardSummary + 454, // 195: datanode.api.v2.ObserveRewardsResponse.reward:type_name -> vega.Reward + 457, // 196: datanode.api.v2.GetDepositResponse.deposit:type_name -> vega.Deposit 6, // 197: datanode.api.v2.ListDepositsRequest.pagination:type_name -> datanode.api.v2.Pagination 288, // 198: datanode.api.v2.ListDepositsRequest.date_range:type_name -> datanode.api.v2.DateRange 191, // 199: datanode.api.v2.ListDepositsResponse.deposits:type_name -> datanode.api.v2.DepositsConnection - 453, // 200: datanode.api.v2.DepositEdge.node:type_name -> vega.Deposit + 457, // 200: datanode.api.v2.DepositEdge.node:type_name -> vega.Deposit 190, // 201: datanode.api.v2.DepositsConnection.edges:type_name -> datanode.api.v2.DepositEdge 7, // 202: datanode.api.v2.DepositsConnection.page_info:type_name -> datanode.api.v2.PageInfo - 454, // 203: datanode.api.v2.GetWithdrawalResponse.withdrawal:type_name -> vega.Withdrawal + 458, // 203: datanode.api.v2.GetWithdrawalResponse.withdrawal:type_name -> vega.Withdrawal 6, // 204: datanode.api.v2.ListWithdrawalsRequest.pagination:type_name -> datanode.api.v2.Pagination 288, // 205: datanode.api.v2.ListWithdrawalsRequest.date_range:type_name -> datanode.api.v2.DateRange 197, // 206: datanode.api.v2.ListWithdrawalsResponse.withdrawals:type_name -> datanode.api.v2.WithdrawalsConnection - 454, // 207: datanode.api.v2.WithdrawalEdge.node:type_name -> vega.Withdrawal + 458, // 207: datanode.api.v2.WithdrawalEdge.node:type_name -> vega.Withdrawal 196, // 208: datanode.api.v2.WithdrawalsConnection.edges:type_name -> datanode.api.v2.WithdrawalEdge 7, // 209: datanode.api.v2.WithdrawalsConnection.page_info:type_name -> datanode.api.v2.PageInfo - 455, // 210: datanode.api.v2.GetAssetResponse.asset:type_name -> vega.Asset + 459, // 210: datanode.api.v2.GetAssetResponse.asset:type_name -> vega.Asset 6, // 211: datanode.api.v2.ListAssetsRequest.pagination:type_name -> datanode.api.v2.Pagination 203, // 212: datanode.api.v2.ListAssetsResponse.assets:type_name -> datanode.api.v2.AssetsConnection - 455, // 213: datanode.api.v2.AssetEdge.node:type_name -> vega.Asset + 459, // 213: datanode.api.v2.AssetEdge.node:type_name -> vega.Asset 202, // 214: datanode.api.v2.AssetsConnection.edges:type_name -> datanode.api.v2.AssetEdge 7, // 215: datanode.api.v2.AssetsConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 216: datanode.api.v2.ListLiquidityProvisionsRequest.pagination:type_name -> datanode.api.v2.Pagination 6, // 217: datanode.api.v2.ListAllLiquidityProvisionsRequest.pagination:type_name -> datanode.api.v2.Pagination 211, // 218: datanode.api.v2.ListLiquidityProvisionsResponse.liquidity_provisions:type_name -> datanode.api.v2.LiquidityProvisionsConnection 212, // 219: datanode.api.v2.ListAllLiquidityProvisionsResponse.liquidity_provisions:type_name -> datanode.api.v2.LiquidityProvisionsWithPendingConnection - 456, // 220: datanode.api.v2.LiquidityProvision.current:type_name -> vega.LiquidityProvision - 456, // 221: datanode.api.v2.LiquidityProvision.pending:type_name -> vega.LiquidityProvision - 456, // 222: datanode.api.v2.LiquidityProvisionsEdge.node:type_name -> vega.LiquidityProvision + 460, // 220: datanode.api.v2.LiquidityProvision.current:type_name -> vega.LiquidityProvision + 460, // 221: datanode.api.v2.LiquidityProvision.pending:type_name -> vega.LiquidityProvision + 460, // 222: datanode.api.v2.LiquidityProvisionsEdge.node:type_name -> vega.LiquidityProvision 208, // 223: datanode.api.v2.LiquidityProvisionWithPendingEdge.node:type_name -> datanode.api.v2.LiquidityProvision 209, // 224: datanode.api.v2.LiquidityProvisionsConnection.edges:type_name -> datanode.api.v2.LiquidityProvisionsEdge 7, // 225: datanode.api.v2.LiquidityProvisionsConnection.page_info:type_name -> datanode.api.v2.PageInfo 210, // 226: datanode.api.v2.LiquidityProvisionsWithPendingConnection.edges:type_name -> datanode.api.v2.LiquidityProvisionWithPendingEdge 7, // 227: datanode.api.v2.LiquidityProvisionsWithPendingConnection.page_info:type_name -> datanode.api.v2.PageInfo - 456, // 228: datanode.api.v2.ObserveLiquidityProvisionsResponse.liquidity_provisions:type_name -> vega.LiquidityProvision + 460, // 228: datanode.api.v2.ObserveLiquidityProvisionsResponse.liquidity_provisions:type_name -> vega.LiquidityProvision 6, // 229: datanode.api.v2.ListLiquidityProvidersRequest.pagination:type_name -> datanode.api.v2.Pagination - 457, // 230: datanode.api.v2.LiquidityProvider.fee_share:type_name -> vega.LiquidityProviderFeeShare - 458, // 231: datanode.api.v2.LiquidityProvider.sla:type_name -> vega.LiquidityProviderSLA + 461, // 230: datanode.api.v2.LiquidityProvider.fee_share:type_name -> vega.LiquidityProviderFeeShare + 462, // 231: datanode.api.v2.LiquidityProvider.sla:type_name -> vega.LiquidityProviderSLA 216, // 232: datanode.api.v2.LiquidityProviderEdge.node:type_name -> datanode.api.v2.LiquidityProvider 217, // 233: datanode.api.v2.LiquidityProviderConnection.edges:type_name -> datanode.api.v2.LiquidityProviderEdge 7, // 234: datanode.api.v2.LiquidityProviderConnection.page_info:type_name -> datanode.api.v2.PageInfo 218, // 235: datanode.api.v2.ListLiquidityProvidersResponse.liquidity_providers:type_name -> datanode.api.v2.LiquidityProviderConnection 6, // 236: datanode.api.v2.ListPaidLiquidityFeesRequest.pagination:type_name -> datanode.api.v2.Pagination 223, // 237: datanode.api.v2.ListPaidLiquidityFeesResponse.paid_liquidity_fees:type_name -> datanode.api.v2.PaidLiquidityFeesConnection - 459, // 238: datanode.api.v2.PaidLiquidityFeesEdge.node:type_name -> vega.events.v1.PaidLiquidityFeesStats + 463, // 238: datanode.api.v2.PaidLiquidityFeesEdge.node:type_name -> vega.events.v1.PaidLiquidityFeesStats 222, // 239: datanode.api.v2.PaidLiquidityFeesConnection.edges:type_name -> datanode.api.v2.PaidLiquidityFeesEdge 7, // 240: datanode.api.v2.PaidLiquidityFeesConnection.page_info:type_name -> datanode.api.v2.PageInfo - 446, // 241: datanode.api.v2.GetGovernanceDataResponse.data:type_name -> vega.GovernanceData - 460, // 242: datanode.api.v2.ListGovernanceDataRequest.proposal_state:type_name -> vega.Proposal.State + 450, // 241: datanode.api.v2.GetGovernanceDataResponse.data:type_name -> vega.GovernanceData + 464, // 242: datanode.api.v2.ListGovernanceDataRequest.proposal_state:type_name -> vega.Proposal.State 5, // 243: datanode.api.v2.ListGovernanceDataRequest.proposal_type:type_name -> datanode.api.v2.ListGovernanceDataRequest.Type 6, // 244: datanode.api.v2.ListGovernanceDataRequest.pagination:type_name -> datanode.api.v2.Pagination 229, // 245: datanode.api.v2.ListGovernanceDataResponse.connection:type_name -> datanode.api.v2.GovernanceDataConnection - 446, // 246: datanode.api.v2.GovernanceDataEdge.node:type_name -> vega.GovernanceData + 450, // 246: datanode.api.v2.GovernanceDataEdge.node:type_name -> vega.GovernanceData 228, // 247: datanode.api.v2.GovernanceDataConnection.edges:type_name -> datanode.api.v2.GovernanceDataEdge 7, // 248: datanode.api.v2.GovernanceDataConnection.page_info:type_name -> datanode.api.v2.PageInfo - 446, // 249: datanode.api.v2.ObserveGovernanceResponse.data:type_name -> vega.GovernanceData + 450, // 249: datanode.api.v2.ObserveGovernanceResponse.data:type_name -> vega.GovernanceData 6, // 250: datanode.api.v2.ListDelegationsRequest.pagination:type_name -> datanode.api.v2.Pagination 235, // 251: datanode.api.v2.ListDelegationsResponse.delegations:type_name -> datanode.api.v2.DelegationsConnection - 461, // 252: datanode.api.v2.DelegationEdge.node:type_name -> vega.Delegation + 465, // 252: datanode.api.v2.DelegationEdge.node:type_name -> vega.Delegation 234, // 253: datanode.api.v2.DelegationsConnection.edges:type_name -> datanode.api.v2.DelegationEdge 7, // 254: datanode.api.v2.DelegationsConnection.page_info:type_name -> datanode.api.v2.PageInfo - 461, // 255: datanode.api.v2.ObserveDelegationsResponse.delegation:type_name -> vega.Delegation - 462, // 256: datanode.api.v2.NodeBasic.status:type_name -> vega.NodeStatus - 463, // 257: datanode.api.v2.GetNetworkDataResponse.node_data:type_name -> vega.NodeData - 464, // 258: datanode.api.v2.GetNodeResponse.node:type_name -> vega.Node + 465, // 255: datanode.api.v2.ObserveDelegationsResponse.delegation:type_name -> vega.Delegation + 466, // 256: datanode.api.v2.NodeBasic.status:type_name -> vega.NodeStatus + 467, // 257: datanode.api.v2.GetNetworkDataResponse.node_data:type_name -> vega.NodeData + 468, // 258: datanode.api.v2.GetNodeResponse.node:type_name -> vega.Node 6, // 259: datanode.api.v2.ListNodesRequest.pagination:type_name -> datanode.api.v2.Pagination 246, // 260: datanode.api.v2.ListNodesResponse.nodes:type_name -> datanode.api.v2.NodesConnection - 464, // 261: datanode.api.v2.NodeEdge.node:type_name -> vega.Node + 468, // 261: datanode.api.v2.NodeEdge.node:type_name -> vega.Node 245, // 262: datanode.api.v2.NodesConnection.edges:type_name -> datanode.api.v2.NodeEdge 7, // 263: datanode.api.v2.NodesConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 264: datanode.api.v2.ListNodeSignaturesRequest.pagination:type_name -> datanode.api.v2.Pagination 250, // 265: datanode.api.v2.ListNodeSignaturesResponse.signatures:type_name -> datanode.api.v2.NodeSignaturesConnection - 465, // 266: datanode.api.v2.NodeSignatureEdge.node:type_name -> vega.commands.v1.NodeSignature + 469, // 266: datanode.api.v2.NodeSignatureEdge.node:type_name -> vega.commands.v1.NodeSignature 249, // 267: datanode.api.v2.NodeSignaturesConnection.edges:type_name -> datanode.api.v2.NodeSignatureEdge 7, // 268: datanode.api.v2.NodeSignaturesConnection.page_info:type_name -> datanode.api.v2.PageInfo - 466, // 269: datanode.api.v2.GetEpochResponse.epoch:type_name -> vega.Epoch - 467, // 270: datanode.api.v2.EstimateFeeResponse.fee:type_name -> vega.Fee - 468, // 271: datanode.api.v2.EstimateMarginRequest.side:type_name -> vega.Side - 424, // 272: datanode.api.v2.EstimateMarginRequest.type:type_name -> vega.Order.Type - 449, // 273: datanode.api.v2.EstimateMarginResponse.margin_levels:type_name -> vega.MarginLevels + 470, // 269: datanode.api.v2.GetEpochResponse.epoch:type_name -> vega.Epoch + 471, // 270: datanode.api.v2.EstimateFeeResponse.fee:type_name -> vega.Fee + 472, // 271: datanode.api.v2.EstimateMarginRequest.side:type_name -> vega.Side + 428, // 272: datanode.api.v2.EstimateMarginRequest.type:type_name -> vega.Order.Type + 453, // 273: datanode.api.v2.EstimateMarginResponse.margin_levels:type_name -> vega.MarginLevels 6, // 274: datanode.api.v2.ListNetworkParametersRequest.pagination:type_name -> datanode.api.v2.Pagination 262, // 275: datanode.api.v2.ListNetworkParametersResponse.network_parameters:type_name -> datanode.api.v2.NetworkParameterConnection - 469, // 276: datanode.api.v2.GetNetworkParameterResponse.network_parameter:type_name -> vega.NetworkParameter - 469, // 277: datanode.api.v2.NetworkParameterEdge.node:type_name -> vega.NetworkParameter + 473, // 276: datanode.api.v2.GetNetworkParameterResponse.network_parameter:type_name -> vega.NetworkParameter + 473, // 277: datanode.api.v2.NetworkParameterEdge.node:type_name -> vega.NetworkParameter 261, // 278: datanode.api.v2.NetworkParameterConnection.edges:type_name -> datanode.api.v2.NetworkParameterEdge 7, // 279: datanode.api.v2.NetworkParameterConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 280: datanode.api.v2.ListCheckpointsRequest.pagination:type_name -> datanode.api.v2.Pagination @@ -31349,66 +31660,66 @@ var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ 7, // 284: datanode.api.v2.CheckpointsConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 285: datanode.api.v2.GetStakeRequest.pagination:type_name -> datanode.api.v2.Pagination 271, // 286: datanode.api.v2.GetStakeResponse.stake_linkings:type_name -> datanode.api.v2.StakesConnection - 470, // 287: datanode.api.v2.StakeLinkingEdge.node:type_name -> vega.events.v1.StakeLinking + 474, // 287: datanode.api.v2.StakeLinkingEdge.node:type_name -> vega.events.v1.StakeLinking 270, // 288: datanode.api.v2.StakesConnection.edges:type_name -> datanode.api.v2.StakeLinkingEdge 7, // 289: datanode.api.v2.StakesConnection.page_info:type_name -> datanode.api.v2.PageInfo - 471, // 290: datanode.api.v2.GetRiskFactorsResponse.risk_factor:type_name -> vega.RiskFactor - 472, // 291: datanode.api.v2.ObserveEventBusRequest.type:type_name -> vega.events.v1.BusEventType - 473, // 292: datanode.api.v2.ObserveEventBusResponse.events:type_name -> vega.events.v1.BusEvent - 474, // 293: datanode.api.v2.ObserveLedgerMovementsResponse.ledger_movement:type_name -> vega.LedgerMovement + 475, // 290: datanode.api.v2.GetRiskFactorsResponse.risk_factor:type_name -> vega.RiskFactor + 476, // 291: datanode.api.v2.ObserveEventBusRequest.type:type_name -> vega.events.v1.BusEventType + 477, // 292: datanode.api.v2.ObserveEventBusResponse.events:type_name -> vega.events.v1.BusEvent + 478, // 293: datanode.api.v2.ObserveLedgerMovementsResponse.ledger_movement:type_name -> vega.LedgerMovement 6, // 294: datanode.api.v2.ListKeyRotationsRequest.pagination:type_name -> datanode.api.v2.Pagination 281, // 295: datanode.api.v2.ListKeyRotationsResponse.rotations:type_name -> datanode.api.v2.KeyRotationConnection - 475, // 296: datanode.api.v2.KeyRotationEdge.node:type_name -> vega.events.v1.KeyRotation + 479, // 296: datanode.api.v2.KeyRotationEdge.node:type_name -> vega.events.v1.KeyRotation 280, // 297: datanode.api.v2.KeyRotationConnection.edges:type_name -> datanode.api.v2.KeyRotationEdge 7, // 298: datanode.api.v2.KeyRotationConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 299: datanode.api.v2.ListEthereumKeyRotationsRequest.pagination:type_name -> datanode.api.v2.Pagination 284, // 300: datanode.api.v2.ListEthereumKeyRotationsResponse.key_rotations:type_name -> datanode.api.v2.EthereumKeyRotationsConnection 285, // 301: datanode.api.v2.EthereumKeyRotationsConnection.edges:type_name -> datanode.api.v2.EthereumKeyRotationEdge 7, // 302: datanode.api.v2.EthereumKeyRotationsConnection.page_info:type_name -> datanode.api.v2.PageInfo - 476, // 303: datanode.api.v2.EthereumKeyRotationEdge.node:type_name -> vega.events.v1.EthereumKeyRotation - 477, // 304: datanode.api.v2.ListProtocolUpgradeProposalsRequest.status:type_name -> vega.events.v1.ProtocolUpgradeProposalStatus + 480, // 303: datanode.api.v2.EthereumKeyRotationEdge.node:type_name -> vega.events.v1.EthereumKeyRotation + 481, // 304: datanode.api.v2.ListProtocolUpgradeProposalsRequest.status:type_name -> vega.events.v1.ProtocolUpgradeProposalStatus 6, // 305: datanode.api.v2.ListProtocolUpgradeProposalsRequest.pagination:type_name -> datanode.api.v2.Pagination 293, // 306: datanode.api.v2.ListProtocolUpgradeProposalsResponse.protocol_upgrade_proposals:type_name -> datanode.api.v2.ProtocolUpgradeProposalConnection 294, // 307: datanode.api.v2.ProtocolUpgradeProposalConnection.edges:type_name -> datanode.api.v2.ProtocolUpgradeProposalEdge 7, // 308: datanode.api.v2.ProtocolUpgradeProposalConnection.page_info:type_name -> datanode.api.v2.PageInfo - 478, // 309: datanode.api.v2.ProtocolUpgradeProposalEdge.node:type_name -> vega.events.v1.ProtocolUpgradeEvent + 482, // 309: datanode.api.v2.ProtocolUpgradeProposalEdge.node:type_name -> vega.events.v1.ProtocolUpgradeEvent 6, // 310: datanode.api.v2.ListCoreSnapshotsRequest.pagination:type_name -> datanode.api.v2.Pagination 297, // 311: datanode.api.v2.ListCoreSnapshotsResponse.core_snapshots:type_name -> datanode.api.v2.CoreSnapshotConnection 298, // 312: datanode.api.v2.CoreSnapshotConnection.edges:type_name -> datanode.api.v2.CoreSnapshotEdge 7, // 313: datanode.api.v2.CoreSnapshotConnection.page_info:type_name -> datanode.api.v2.PageInfo - 479, // 314: datanode.api.v2.CoreSnapshotEdge.node:type_name -> vega.events.v1.CoreSnapshotData + 483, // 314: datanode.api.v2.CoreSnapshotEdge.node:type_name -> vega.events.v1.CoreSnapshotData 299, // 315: datanode.api.v2.GetMostRecentNetworkHistorySegmentResponse.segment:type_name -> datanode.api.v2.HistorySegment 299, // 316: datanode.api.v2.ListAllNetworkHistorySegmentsResponse.segments:type_name -> datanode.api.v2.HistorySegment 3, // 317: datanode.api.v2.ExportNetworkHistoryRequest.table:type_name -> datanode.api.v2.Table - 480, // 318: datanode.api.v2.ListEntitiesResponse.accounts:type_name -> vega.Account - 422, // 319: datanode.api.v2.ListEntitiesResponse.orders:type_name -> vega.Order - 429, // 320: datanode.api.v2.ListEntitiesResponse.positions:type_name -> vega.Position - 481, // 321: datanode.api.v2.ListEntitiesResponse.ledger_entries:type_name -> vega.LedgerEntry + 484, // 318: datanode.api.v2.ListEntitiesResponse.accounts:type_name -> vega.Account + 426, // 319: datanode.api.v2.ListEntitiesResponse.orders:type_name -> vega.Order + 433, // 320: datanode.api.v2.ListEntitiesResponse.positions:type_name -> vega.Position + 485, // 321: datanode.api.v2.ListEntitiesResponse.ledger_entries:type_name -> vega.LedgerEntry 12, // 322: datanode.api.v2.ListEntitiesResponse.balance_changes:type_name -> datanode.api.v2.AccountBalance - 437, // 323: datanode.api.v2.ListEntitiesResponse.transfers:type_name -> vega.events.v1.Transfer - 440, // 324: datanode.api.v2.ListEntitiesResponse.votes:type_name -> vega.Vote + 441, // 323: datanode.api.v2.ListEntitiesResponse.transfers:type_name -> vega.events.v1.Transfer + 444, // 324: datanode.api.v2.ListEntitiesResponse.votes:type_name -> vega.Vote 113, // 325: datanode.api.v2.ListEntitiesResponse.erc20_multi_sig_signer_added_bundles:type_name -> datanode.api.v2.ERC20MultiSigSignerAddedBundle 119, // 326: datanode.api.v2.ListEntitiesResponse.erc20_multi_sig_signer_removed_bundles:type_name -> datanode.api.v2.ERC20MultiSigSignerRemovedBundle - 435, // 327: datanode.api.v2.ListEntitiesResponse.trades:type_name -> vega.Trade - 443, // 328: datanode.api.v2.ListEntitiesResponse.oracle_specs:type_name -> vega.OracleSpec - 444, // 329: datanode.api.v2.ListEntitiesResponse.oracle_data:type_name -> vega.OracleData - 445, // 330: datanode.api.v2.ListEntitiesResponse.markets:type_name -> vega.Market - 447, // 331: datanode.api.v2.ListEntitiesResponse.parties:type_name -> vega.Party - 449, // 332: datanode.api.v2.ListEntitiesResponse.margin_levels:type_name -> vega.MarginLevels - 450, // 333: datanode.api.v2.ListEntitiesResponse.rewards:type_name -> vega.Reward - 453, // 334: datanode.api.v2.ListEntitiesResponse.deposits:type_name -> vega.Deposit - 454, // 335: datanode.api.v2.ListEntitiesResponse.withdrawals:type_name -> vega.Withdrawal - 455, // 336: datanode.api.v2.ListEntitiesResponse.assets:type_name -> vega.Asset - 456, // 337: datanode.api.v2.ListEntitiesResponse.liquidity_provisions:type_name -> vega.LiquidityProvision - 482, // 338: datanode.api.v2.ListEntitiesResponse.proposals:type_name -> vega.Proposal - 461, // 339: datanode.api.v2.ListEntitiesResponse.delegations:type_name -> vega.Delegation + 439, // 327: datanode.api.v2.ListEntitiesResponse.trades:type_name -> vega.Trade + 447, // 328: datanode.api.v2.ListEntitiesResponse.oracle_specs:type_name -> vega.OracleSpec + 448, // 329: datanode.api.v2.ListEntitiesResponse.oracle_data:type_name -> vega.OracleData + 449, // 330: datanode.api.v2.ListEntitiesResponse.markets:type_name -> vega.Market + 451, // 331: datanode.api.v2.ListEntitiesResponse.parties:type_name -> vega.Party + 453, // 332: datanode.api.v2.ListEntitiesResponse.margin_levels:type_name -> vega.MarginLevels + 454, // 333: datanode.api.v2.ListEntitiesResponse.rewards:type_name -> vega.Reward + 457, // 334: datanode.api.v2.ListEntitiesResponse.deposits:type_name -> vega.Deposit + 458, // 335: datanode.api.v2.ListEntitiesResponse.withdrawals:type_name -> vega.Withdrawal + 459, // 336: datanode.api.v2.ListEntitiesResponse.assets:type_name -> vega.Asset + 460, // 337: datanode.api.v2.ListEntitiesResponse.liquidity_provisions:type_name -> vega.LiquidityProvision + 486, // 338: datanode.api.v2.ListEntitiesResponse.proposals:type_name -> vega.Proposal + 465, // 339: datanode.api.v2.ListEntitiesResponse.delegations:type_name -> vega.Delegation 238, // 340: datanode.api.v2.ListEntitiesResponse.nodes:type_name -> datanode.api.v2.NodeBasic - 465, // 341: datanode.api.v2.ListEntitiesResponse.node_signatures:type_name -> vega.commands.v1.NodeSignature - 469, // 342: datanode.api.v2.ListEntitiesResponse.network_parameters:type_name -> vega.NetworkParameter - 475, // 343: datanode.api.v2.ListEntitiesResponse.key_rotations:type_name -> vega.events.v1.KeyRotation - 476, // 344: datanode.api.v2.ListEntitiesResponse.ethereum_key_rotations:type_name -> vega.events.v1.EthereumKeyRotation - 478, // 345: datanode.api.v2.ListEntitiesResponse.protocol_upgrade_proposals:type_name -> vega.events.v1.ProtocolUpgradeEvent - 483, // 346: datanode.api.v2.GetPartyActivityStreakResponse.activity_streak:type_name -> vega.events.v1.PartyActivityStreak + 469, // 341: datanode.api.v2.ListEntitiesResponse.node_signatures:type_name -> vega.commands.v1.NodeSignature + 473, // 342: datanode.api.v2.ListEntitiesResponse.network_parameters:type_name -> vega.NetworkParameter + 479, // 343: datanode.api.v2.ListEntitiesResponse.key_rotations:type_name -> vega.events.v1.KeyRotation + 480, // 344: datanode.api.v2.ListEntitiesResponse.ethereum_key_rotations:type_name -> vega.events.v1.EthereumKeyRotation + 482, // 345: datanode.api.v2.ListEntitiesResponse.protocol_upgrade_proposals:type_name -> vega.events.v1.ProtocolUpgradeEvent + 487, // 346: datanode.api.v2.GetPartyActivityStreakResponse.activity_streak:type_name -> vega.events.v1.PartyActivityStreak 6, // 347: datanode.api.v2.ListFundingPaymentsRequest.pagination:type_name -> datanode.api.v2.Pagination 315, // 348: datanode.api.v2.FundingPaymentEdge.node:type_name -> datanode.api.v2.FundingPayment 317, // 349: datanode.api.v2.FundingPaymentConnection.edges:type_name -> datanode.api.v2.FundingPaymentEdge @@ -31416,30 +31727,30 @@ var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ 318, // 351: datanode.api.v2.ListFundingPaymentsResponse.funding_payments:type_name -> datanode.api.v2.FundingPaymentConnection 288, // 352: datanode.api.v2.ListFundingPeriodsRequest.date_range:type_name -> datanode.api.v2.DateRange 6, // 353: datanode.api.v2.ListFundingPeriodsRequest.pagination:type_name -> datanode.api.v2.Pagination - 484, // 354: datanode.api.v2.FundingPeriodEdge.node:type_name -> vega.events.v1.FundingPeriod + 488, // 354: datanode.api.v2.FundingPeriodEdge.node:type_name -> vega.events.v1.FundingPeriod 321, // 355: datanode.api.v2.FundingPeriodConnection.edges:type_name -> datanode.api.v2.FundingPeriodEdge 7, // 356: datanode.api.v2.FundingPeriodConnection.page_info:type_name -> datanode.api.v2.PageInfo 322, // 357: datanode.api.v2.ListFundingPeriodsResponse.funding_periods:type_name -> datanode.api.v2.FundingPeriodConnection 288, // 358: datanode.api.v2.ListFundingPeriodDataPointsRequest.date_range:type_name -> datanode.api.v2.DateRange - 485, // 359: datanode.api.v2.ListFundingPeriodDataPointsRequest.source:type_name -> vega.events.v1.FundingPeriodDataPoint.Source + 489, // 359: datanode.api.v2.ListFundingPeriodDataPointsRequest.source:type_name -> vega.events.v1.FundingPeriodDataPoint.Source 6, // 360: datanode.api.v2.ListFundingPeriodDataPointsRequest.pagination:type_name -> datanode.api.v2.Pagination - 486, // 361: datanode.api.v2.FundingPeriodDataPointEdge.node:type_name -> vega.events.v1.FundingPeriodDataPoint + 490, // 361: datanode.api.v2.FundingPeriodDataPointEdge.node:type_name -> vega.events.v1.FundingPeriodDataPoint 325, // 362: datanode.api.v2.FundingPeriodDataPointConnection.edges:type_name -> datanode.api.v2.FundingPeriodDataPointEdge 7, // 363: datanode.api.v2.FundingPeriodDataPointConnection.page_info:type_name -> datanode.api.v2.PageInfo 326, // 364: datanode.api.v2.ListFundingPeriodDataPointsResponse.funding_period_data_points:type_name -> datanode.api.v2.FundingPeriodDataPointConnection - 468, // 365: datanode.api.v2.OrderInfo.side:type_name -> vega.Side + 472, // 365: datanode.api.v2.OrderInfo.side:type_name -> vega.Side 330, // 366: datanode.api.v2.EstimatePositionRequest.orders:type_name -> datanode.api.v2.OrderInfo - 487, // 367: datanode.api.v2.EstimatePositionRequest.margin_mode:type_name -> vega.MarginMode + 491, // 367: datanode.api.v2.EstimatePositionRequest.margin_mode:type_name -> vega.MarginMode 334, // 368: datanode.api.v2.EstimatePositionResponse.margin:type_name -> datanode.api.v2.MarginEstimate 333, // 369: datanode.api.v2.EstimatePositionResponse.collateral_increase_estimate:type_name -> datanode.api.v2.CollateralIncreaseEstimate 335, // 370: datanode.api.v2.EstimatePositionResponse.liquidation:type_name -> datanode.api.v2.LiquidationEstimate - 449, // 371: datanode.api.v2.MarginEstimate.worst_case:type_name -> vega.MarginLevels - 449, // 372: datanode.api.v2.MarginEstimate.best_case:type_name -> vega.MarginLevels + 453, // 371: datanode.api.v2.MarginEstimate.worst_case:type_name -> vega.MarginLevels + 453, // 372: datanode.api.v2.MarginEstimate.best_case:type_name -> vega.MarginLevels 336, // 373: datanode.api.v2.LiquidationEstimate.worst_case:type_name -> datanode.api.v2.LiquidationPrice 336, // 374: datanode.api.v2.LiquidationEstimate.best_case:type_name -> datanode.api.v2.LiquidationPrice 339, // 375: datanode.api.v2.GetCurrentReferralProgramResponse.current_referral_program:type_name -> datanode.api.v2.ReferralProgram - 488, // 376: datanode.api.v2.ReferralProgram.benefit_tiers:type_name -> vega.BenefitTier - 489, // 377: datanode.api.v2.ReferralProgram.staking_tiers:type_name -> vega.StakingTier + 492, // 376: datanode.api.v2.ReferralProgram.benefit_tiers:type_name -> vega.BenefitTier + 493, // 377: datanode.api.v2.ReferralProgram.staking_tiers:type_name -> vega.StakingTier 340, // 378: datanode.api.v2.ReferralSetEdge.node:type_name -> datanode.api.v2.ReferralSet 341, // 379: datanode.api.v2.ReferralSetConnection.edges:type_name -> datanode.api.v2.ReferralSetEdge 7, // 380: datanode.api.v2.ReferralSetConnection.page_info:type_name -> datanode.api.v2.PageInfo @@ -31484,7 +31795,7 @@ var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ 7, // 419: datanode.api.v2.TeamRefereeHistoryConnection.page_info:type_name -> datanode.api.v2.PageInfo 6, // 420: datanode.api.v2.ListTeamRefereeHistoryRequest.pagination:type_name -> datanode.api.v2.Pagination 379, // 421: datanode.api.v2.ListTeamRefereeHistoryResponse.team_referee_history:type_name -> datanode.api.v2.TeamRefereeHistoryConnection - 490, // 422: datanode.api.v2.GetFeesStatsResponse.fees_stats:type_name -> vega.events.v1.FeesStats + 494, // 422: datanode.api.v2.GetFeesStatsResponse.fees_stats:type_name -> vega.events.v1.FeesStats 394, // 423: datanode.api.v2.GetFeesStatsForPartyResponse.fees_stats_for_party:type_name -> datanode.api.v2.FeesStatsForParty 393, // 424: datanode.api.v2.GetCurrentVolumeDiscountProgramResponse.current_volume_discount_program:type_name -> datanode.api.v2.VolumeDiscountProgram 6, // 425: datanode.api.v2.GetVolumeDiscountStatsRequest.pagination:type_name -> datanode.api.v2.Pagination @@ -31492,10 +31803,10 @@ var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ 391, // 427: datanode.api.v2.VolumeDiscountStatsConnection.edges:type_name -> datanode.api.v2.VolumeDiscountStatsEdge 7, // 428: datanode.api.v2.VolumeDiscountStatsConnection.page_info:type_name -> datanode.api.v2.PageInfo 392, // 429: datanode.api.v2.VolumeDiscountStatsEdge.node:type_name -> datanode.api.v2.VolumeDiscountStats - 491, // 430: datanode.api.v2.VolumeDiscountProgram.benefit_tiers:type_name -> vega.VolumeBenefitTier - 492, // 431: datanode.api.v2.ObserveTransactionResultsResponse.transaction_results:type_name -> vega.events.v1.TransactionResult - 421, // 432: datanode.api.v2.EstimateTransferFeeRequest.from_account_type:type_name -> vega.AccountType - 493, // 433: datanode.api.v2.ListGamesRequest.entity_scope:type_name -> vega.EntityScope + 495, // 430: datanode.api.v2.VolumeDiscountProgram.benefit_tiers:type_name -> vega.VolumeBenefitTier + 496, // 431: datanode.api.v2.ObserveTransactionResultsResponse.transaction_results:type_name -> vega.events.v1.TransactionResult + 425, // 432: datanode.api.v2.EstimateTransferFeeRequest.from_account_type:type_name -> vega.AccountType + 497, // 433: datanode.api.v2.ListGamesRequest.entity_scope:type_name -> vega.EntityScope 6, // 434: datanode.api.v2.ListGamesRequest.pagination:type_name -> datanode.api.v2.Pagination 403, // 435: datanode.api.v2.ListGamesResponse.games:type_name -> datanode.api.v2.GamesConnection 404, // 436: datanode.api.v2.GamesConnection.edges:type_name -> datanode.api.v2.GameEdge @@ -31506,263 +31817,271 @@ var file_data_node_api_v2_trading_data_proto_depIdxs = []int32{ 408, // 441: datanode.api.v2.TeamGameEntities.team:type_name -> datanode.api.v2.TeamGameEntity 410, // 442: datanode.api.v2.IndividualGameEntities.individual:type_name -> datanode.api.v2.IndividualGameEntity 409, // 443: datanode.api.v2.TeamGameEntity.team:type_name -> datanode.api.v2.TeamGameParticipation - 494, // 444: datanode.api.v2.TeamGameEntity.reward_metric:type_name -> vega.DispatchMetric + 498, // 444: datanode.api.v2.TeamGameEntity.reward_metric:type_name -> vega.DispatchMetric 410, // 445: datanode.api.v2.TeamGameParticipation.members_participating:type_name -> datanode.api.v2.IndividualGameEntity - 494, // 446: datanode.api.v2.IndividualGameEntity.reward_metric:type_name -> vega.DispatchMetric + 498, // 446: datanode.api.v2.IndividualGameEntity.reward_metric:type_name -> vega.DispatchMetric 6, // 447: datanode.api.v2.ListPartyMarginModesRequest.pagination:type_name -> datanode.api.v2.Pagination 413, // 448: datanode.api.v2.ListPartyMarginModesResponse.party_margin_modes:type_name -> datanode.api.v2.PartyMarginModesConnection 414, // 449: datanode.api.v2.PartyMarginModesConnection.edges:type_name -> datanode.api.v2.PartyMarginModeEdge 7, // 450: datanode.api.v2.PartyMarginModesConnection.page_info:type_name -> datanode.api.v2.PageInfo 415, // 451: datanode.api.v2.PartyMarginModeEdge.node:type_name -> datanode.api.v2.PartyMarginMode - 487, // 452: datanode.api.v2.PartyMarginMode.margin_mode:type_name -> vega.MarginMode + 491, // 452: datanode.api.v2.PartyMarginMode.margin_mode:type_name -> vega.MarginMode 416, // 453: datanode.api.v2.GetTimeWeightedNotionalPositionResponse.time_weighted_notional_position:type_name -> datanode.api.v2.TimeWeightedNotionalPosition - 13, // 454: datanode.api.v2.TradingDataService.ListAccounts:input_type -> datanode.api.v2.ListAccountsRequest - 17, // 455: datanode.api.v2.TradingDataService.ObserveAccounts:input_type -> datanode.api.v2.ObserveAccountsRequest - 21, // 456: datanode.api.v2.TradingDataService.Info:input_type -> datanode.api.v2.InfoRequest - 23, // 457: datanode.api.v2.TradingDataService.GetOrder:input_type -> datanode.api.v2.GetOrderRequest - 26, // 458: datanode.api.v2.TradingDataService.ListOrders:input_type -> datanode.api.v2.ListOrdersRequest - 28, // 459: datanode.api.v2.TradingDataService.ListOrderVersions:input_type -> datanode.api.v2.ListOrderVersionsRequest - 30, // 460: datanode.api.v2.TradingDataService.ObserveOrders:input_type -> datanode.api.v2.ObserveOrdersRequest - 34, // 461: datanode.api.v2.TradingDataService.GetStopOrder:input_type -> datanode.api.v2.GetStopOrderRequest - 36, // 462: datanode.api.v2.TradingDataService.ListStopOrders:input_type -> datanode.api.v2.ListStopOrdersRequest - 41, // 463: datanode.api.v2.TradingDataService.ListPositions:input_type -> datanode.api.v2.ListPositionsRequest - 44, // 464: datanode.api.v2.TradingDataService.ListAllPositions:input_type -> datanode.api.v2.ListAllPositionsRequest - 48, // 465: datanode.api.v2.TradingDataService.ObservePositions:input_type -> datanode.api.v2.ObservePositionsRequest - 54, // 466: datanode.api.v2.TradingDataService.ListLedgerEntries:input_type -> datanode.api.v2.ListLedgerEntriesRequest - 55, // 467: datanode.api.v2.TradingDataService.ExportLedgerEntries:input_type -> datanode.api.v2.ExportLedgerEntriesRequest - 59, // 468: datanode.api.v2.TradingDataService.ListBalanceChanges:input_type -> datanode.api.v2.ListBalanceChangesRequest - 77, // 469: datanode.api.v2.TradingDataService.GetLatestMarketData:input_type -> datanode.api.v2.GetLatestMarketDataRequest - 75, // 470: datanode.api.v2.TradingDataService.ListLatestMarketData:input_type -> datanode.api.v2.ListLatestMarketDataRequest - 73, // 471: datanode.api.v2.TradingDataService.GetLatestMarketDepth:input_type -> datanode.api.v2.GetLatestMarketDepthRequest - 67, // 472: datanode.api.v2.TradingDataService.ObserveMarketsDepth:input_type -> datanode.api.v2.ObserveMarketsDepthRequest - 69, // 473: datanode.api.v2.TradingDataService.ObserveMarketsDepthUpdates:input_type -> datanode.api.v2.ObserveMarketsDepthUpdatesRequest - 71, // 474: datanode.api.v2.TradingDataService.ObserveMarketsData:input_type -> datanode.api.v2.ObserveMarketsDataRequest - 79, // 475: datanode.api.v2.TradingDataService.GetMarketDataHistoryByID:input_type -> datanode.api.v2.GetMarketDataHistoryByIDRequest - 83, // 476: datanode.api.v2.TradingDataService.ListTransfers:input_type -> datanode.api.v2.ListTransfersRequest - 88, // 477: datanode.api.v2.TradingDataService.GetTransfer:input_type -> datanode.api.v2.GetTransferRequest - 90, // 478: datanode.api.v2.TradingDataService.GetNetworkLimits:input_type -> datanode.api.v2.GetNetworkLimitsRequest - 98, // 479: datanode.api.v2.TradingDataService.ListCandleData:input_type -> datanode.api.v2.ListCandleDataRequest - 96, // 480: datanode.api.v2.TradingDataService.ObserveCandleData:input_type -> datanode.api.v2.ObserveCandleDataRequest - 92, // 481: datanode.api.v2.TradingDataService.ListCandleIntervals:input_type -> datanode.api.v2.ListCandleIntervalsRequest - 102, // 482: datanode.api.v2.TradingDataService.ListVotes:input_type -> datanode.api.v2.ListVotesRequest - 106, // 483: datanode.api.v2.TradingDataService.ObserveVotes:input_type -> datanode.api.v2.ObserveVotesRequest - 108, // 484: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerAddedBundles:input_type -> datanode.api.v2.ListERC20MultiSigSignerAddedBundlesRequest - 114, // 485: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerRemovedBundles:input_type -> datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesRequest - 120, // 486: datanode.api.v2.TradingDataService.GetERC20ListAssetBundle:input_type -> datanode.api.v2.GetERC20ListAssetBundleRequest - 122, // 487: datanode.api.v2.TradingDataService.GetERC20SetAssetLimitsBundle:input_type -> datanode.api.v2.GetERC20SetAssetLimitsBundleRequest - 124, // 488: datanode.api.v2.TradingDataService.GetERC20WithdrawalApproval:input_type -> datanode.api.v2.GetERC20WithdrawalApprovalRequest - 126, // 489: datanode.api.v2.TradingDataService.GetLastTrade:input_type -> datanode.api.v2.GetLastTradeRequest - 128, // 490: datanode.api.v2.TradingDataService.ListTrades:input_type -> datanode.api.v2.ListTradesRequest - 132, // 491: datanode.api.v2.TradingDataService.ObserveTrades:input_type -> datanode.api.v2.ObserveTradesRequest - 134, // 492: datanode.api.v2.TradingDataService.GetOracleSpec:input_type -> datanode.api.v2.GetOracleSpecRequest - 136, // 493: datanode.api.v2.TradingDataService.ListOracleSpecs:input_type -> datanode.api.v2.ListOracleSpecsRequest - 138, // 494: datanode.api.v2.TradingDataService.ListOracleData:input_type -> datanode.api.v2.ListOracleDataRequest - 144, // 495: datanode.api.v2.TradingDataService.GetMarket:input_type -> datanode.api.v2.GetMarketRequest - 146, // 496: datanode.api.v2.TradingDataService.ListMarkets:input_type -> datanode.api.v2.ListMarketsRequest - 150, // 497: datanode.api.v2.TradingDataService.ListSuccessorMarkets:input_type -> datanode.api.v2.ListSuccessorMarketsRequest - 155, // 498: datanode.api.v2.TradingDataService.GetParty:input_type -> datanode.api.v2.GetPartyRequest - 157, // 499: datanode.api.v2.TradingDataService.ListParties:input_type -> datanode.api.v2.ListPartiesRequest - 161, // 500: datanode.api.v2.TradingDataService.ListPartiesProfiles:input_type -> datanode.api.v2.ListPartiesProfilesRequest - 166, // 501: datanode.api.v2.TradingDataService.ListMarginLevels:input_type -> datanode.api.v2.ListMarginLevelsRequest - 168, // 502: datanode.api.v2.TradingDataService.ObserveMarginLevels:input_type -> datanode.api.v2.ObserveMarginLevelsRequest - 173, // 503: datanode.api.v2.TradingDataService.ListRewards:input_type -> datanode.api.v2.ListRewardsRequest - 177, // 504: datanode.api.v2.TradingDataService.ListRewardSummaries:input_type -> datanode.api.v2.ListRewardSummariesRequest - 180, // 505: datanode.api.v2.TradingDataService.ListEpochRewardSummaries:input_type -> datanode.api.v2.ListEpochRewardSummariesRequest - 186, // 506: datanode.api.v2.TradingDataService.GetDeposit:input_type -> datanode.api.v2.GetDepositRequest - 188, // 507: datanode.api.v2.TradingDataService.ListDeposits:input_type -> datanode.api.v2.ListDepositsRequest - 192, // 508: datanode.api.v2.TradingDataService.GetWithdrawal:input_type -> datanode.api.v2.GetWithdrawalRequest - 194, // 509: datanode.api.v2.TradingDataService.ListWithdrawals:input_type -> datanode.api.v2.ListWithdrawalsRequest - 198, // 510: datanode.api.v2.TradingDataService.GetAsset:input_type -> datanode.api.v2.GetAssetRequest - 200, // 511: datanode.api.v2.TradingDataService.ListAssets:input_type -> datanode.api.v2.ListAssetsRequest - 204, // 512: datanode.api.v2.TradingDataService.ListLiquidityProvisions:input_type -> datanode.api.v2.ListLiquidityProvisionsRequest - 205, // 513: datanode.api.v2.TradingDataService.ListAllLiquidityProvisions:input_type -> datanode.api.v2.ListAllLiquidityProvisionsRequest - 213, // 514: datanode.api.v2.TradingDataService.ObserveLiquidityProvisions:input_type -> datanode.api.v2.ObserveLiquidityProvisionsRequest - 215, // 515: datanode.api.v2.TradingDataService.ListLiquidityProviders:input_type -> datanode.api.v2.ListLiquidityProvidersRequest - 220, // 516: datanode.api.v2.TradingDataService.ListPaidLiquidityFees:input_type -> datanode.api.v2.ListPaidLiquidityFeesRequest - 224, // 517: datanode.api.v2.TradingDataService.GetGovernanceData:input_type -> datanode.api.v2.GetGovernanceDataRequest - 226, // 518: datanode.api.v2.TradingDataService.ListGovernanceData:input_type -> datanode.api.v2.ListGovernanceDataRequest - 230, // 519: datanode.api.v2.TradingDataService.ObserveGovernance:input_type -> datanode.api.v2.ObserveGovernanceRequest - 232, // 520: datanode.api.v2.TradingDataService.ListDelegations:input_type -> datanode.api.v2.ListDelegationsRequest - 239, // 521: datanode.api.v2.TradingDataService.GetNetworkData:input_type -> datanode.api.v2.GetNetworkDataRequest - 241, // 522: datanode.api.v2.TradingDataService.GetNode:input_type -> datanode.api.v2.GetNodeRequest - 243, // 523: datanode.api.v2.TradingDataService.ListNodes:input_type -> datanode.api.v2.ListNodesRequest - 247, // 524: datanode.api.v2.TradingDataService.ListNodeSignatures:input_type -> datanode.api.v2.ListNodeSignaturesRequest - 251, // 525: datanode.api.v2.TradingDataService.GetEpoch:input_type -> datanode.api.v2.GetEpochRequest - 253, // 526: datanode.api.v2.TradingDataService.EstimateFee:input_type -> datanode.api.v2.EstimateFeeRequest - 255, // 527: datanode.api.v2.TradingDataService.EstimateMargin:input_type -> datanode.api.v2.EstimateMarginRequest - 331, // 528: datanode.api.v2.TradingDataService.EstimatePosition:input_type -> datanode.api.v2.EstimatePositionRequest - 257, // 529: datanode.api.v2.TradingDataService.ListNetworkParameters:input_type -> datanode.api.v2.ListNetworkParametersRequest - 259, // 530: datanode.api.v2.TradingDataService.GetNetworkParameter:input_type -> datanode.api.v2.GetNetworkParameterRequest - 264, // 531: datanode.api.v2.TradingDataService.ListCheckpoints:input_type -> datanode.api.v2.ListCheckpointsRequest - 268, // 532: datanode.api.v2.TradingDataService.GetStake:input_type -> datanode.api.v2.GetStakeRequest - 272, // 533: datanode.api.v2.TradingDataService.GetRiskFactors:input_type -> datanode.api.v2.GetRiskFactorsRequest - 274, // 534: datanode.api.v2.TradingDataService.ObserveEventBus:input_type -> datanode.api.v2.ObserveEventBusRequest - 276, // 535: datanode.api.v2.TradingDataService.ObserveLedgerMovements:input_type -> datanode.api.v2.ObserveLedgerMovementsRequest - 278, // 536: datanode.api.v2.TradingDataService.ListKeyRotations:input_type -> datanode.api.v2.ListKeyRotationsRequest - 282, // 537: datanode.api.v2.TradingDataService.ListEthereumKeyRotations:input_type -> datanode.api.v2.ListEthereumKeyRotationsRequest - 286, // 538: datanode.api.v2.TradingDataService.GetVegaTime:input_type -> datanode.api.v2.GetVegaTimeRequest - 289, // 539: datanode.api.v2.TradingDataService.GetProtocolUpgradeStatus:input_type -> datanode.api.v2.GetProtocolUpgradeStatusRequest - 291, // 540: datanode.api.v2.TradingDataService.ListProtocolUpgradeProposals:input_type -> datanode.api.v2.ListProtocolUpgradeProposalsRequest - 295, // 541: datanode.api.v2.TradingDataService.ListCoreSnapshots:input_type -> datanode.api.v2.ListCoreSnapshotsRequest - 300, // 542: datanode.api.v2.TradingDataService.GetMostRecentNetworkHistorySegment:input_type -> datanode.api.v2.GetMostRecentNetworkHistorySegmentRequest - 302, // 543: datanode.api.v2.TradingDataService.ListAllNetworkHistorySegments:input_type -> datanode.api.v2.ListAllNetworkHistorySegmentsRequest - 304, // 544: datanode.api.v2.TradingDataService.GetActiveNetworkHistoryPeerAddresses:input_type -> datanode.api.v2.GetActiveNetworkHistoryPeerAddressesRequest - 306, // 545: datanode.api.v2.TradingDataService.GetNetworkHistoryStatus:input_type -> datanode.api.v2.GetNetworkHistoryStatusRequest - 308, // 546: datanode.api.v2.TradingDataService.GetNetworkHistoryBootstrapPeers:input_type -> datanode.api.v2.GetNetworkHistoryBootstrapPeersRequest - 311, // 547: datanode.api.v2.TradingDataService.ListEntities:input_type -> datanode.api.v2.ListEntitiesRequest - 320, // 548: datanode.api.v2.TradingDataService.ListFundingPeriods:input_type -> datanode.api.v2.ListFundingPeriodsRequest - 324, // 549: datanode.api.v2.TradingDataService.ListFundingPeriodDataPoints:input_type -> datanode.api.v2.ListFundingPeriodDataPointsRequest - 316, // 550: datanode.api.v2.TradingDataService.ListFundingPayments:input_type -> datanode.api.v2.ListFundingPaymentsRequest - 313, // 551: datanode.api.v2.TradingDataService.GetPartyActivityStreak:input_type -> datanode.api.v2.GetPartyActivityStreakRequest - 337, // 552: datanode.api.v2.TradingDataService.GetCurrentReferralProgram:input_type -> datanode.api.v2.GetCurrentReferralProgramRequest - 343, // 553: datanode.api.v2.TradingDataService.ListReferralSets:input_type -> datanode.api.v2.ListReferralSetsRequest - 348, // 554: datanode.api.v2.TradingDataService.ListReferralSetReferees:input_type -> datanode.api.v2.ListReferralSetRefereesRequest - 350, // 555: datanode.api.v2.TradingDataService.GetReferralSetStats:input_type -> datanode.api.v2.GetReferralSetStatsRequest - 358, // 556: datanode.api.v2.TradingDataService.ListTeams:input_type -> datanode.api.v2.ListTeamsRequest - 360, // 557: datanode.api.v2.TradingDataService.ListTeamsStatistics:input_type -> datanode.api.v2.ListTeamsStatisticsRequest - 367, // 558: datanode.api.v2.TradingDataService.ListTeamMembersStatistics:input_type -> datanode.api.v2.ListTeamMembersStatisticsRequest - 372, // 559: datanode.api.v2.TradingDataService.ListTeamReferees:input_type -> datanode.api.v2.ListTeamRefereesRequest - 380, // 560: datanode.api.v2.TradingDataService.ListTeamRefereeHistory:input_type -> datanode.api.v2.ListTeamRefereeHistoryRequest - 382, // 561: datanode.api.v2.TradingDataService.GetFeesStats:input_type -> datanode.api.v2.GetFeesStatsRequest - 384, // 562: datanode.api.v2.TradingDataService.GetFeesStatsForParty:input_type -> datanode.api.v2.GetFeesStatsForPartyRequest - 386, // 563: datanode.api.v2.TradingDataService.GetCurrentVolumeDiscountProgram:input_type -> datanode.api.v2.GetCurrentVolumeDiscountProgramRequest - 388, // 564: datanode.api.v2.TradingDataService.GetVolumeDiscountStats:input_type -> datanode.api.v2.GetVolumeDiscountStatsRequest - 10, // 565: datanode.api.v2.TradingDataService.GetVestingBalancesSummary:input_type -> datanode.api.v2.GetVestingBalancesSummaryRequest - 8, // 566: datanode.api.v2.TradingDataService.GetPartyVestingStats:input_type -> datanode.api.v2.GetPartyVestingStatsRequest - 395, // 567: datanode.api.v2.TradingDataService.ObserveTransactionResults:input_type -> datanode.api.v2.ObserveTransactionResultsRequest - 397, // 568: datanode.api.v2.TradingDataService.EstimateTransferFee:input_type -> datanode.api.v2.EstimateTransferFeeRequest - 399, // 569: datanode.api.v2.TradingDataService.GetTotalTransferFeeDiscount:input_type -> datanode.api.v2.GetTotalTransferFeeDiscountRequest - 401, // 570: datanode.api.v2.TradingDataService.ListGames:input_type -> datanode.api.v2.ListGamesRequest - 411, // 571: datanode.api.v2.TradingDataService.ListPartyMarginModes:input_type -> datanode.api.v2.ListPartyMarginModesRequest - 417, // 572: datanode.api.v2.TradingDataService.GetTimeWeightedNotionalPosition:input_type -> datanode.api.v2.GetTimeWeightedNotionalPositionRequest - 310, // 573: datanode.api.v2.TradingDataService.ExportNetworkHistory:input_type -> datanode.api.v2.ExportNetworkHistoryRequest - 328, // 574: datanode.api.v2.TradingDataService.Ping:input_type -> datanode.api.v2.PingRequest - 14, // 575: datanode.api.v2.TradingDataService.ListAccounts:output_type -> datanode.api.v2.ListAccountsResponse - 18, // 576: datanode.api.v2.TradingDataService.ObserveAccounts:output_type -> datanode.api.v2.ObserveAccountsResponse - 22, // 577: datanode.api.v2.TradingDataService.Info:output_type -> datanode.api.v2.InfoResponse - 24, // 578: datanode.api.v2.TradingDataService.GetOrder:output_type -> datanode.api.v2.GetOrderResponse - 27, // 579: datanode.api.v2.TradingDataService.ListOrders:output_type -> datanode.api.v2.ListOrdersResponse - 29, // 580: datanode.api.v2.TradingDataService.ListOrderVersions:output_type -> datanode.api.v2.ListOrderVersionsResponse - 31, // 581: datanode.api.v2.TradingDataService.ObserveOrders:output_type -> datanode.api.v2.ObserveOrdersResponse - 35, // 582: datanode.api.v2.TradingDataService.GetStopOrder:output_type -> datanode.api.v2.GetStopOrderResponse - 40, // 583: datanode.api.v2.TradingDataService.ListStopOrders:output_type -> datanode.api.v2.ListStopOrdersResponse - 42, // 584: datanode.api.v2.TradingDataService.ListPositions:output_type -> datanode.api.v2.ListPositionsResponse - 45, // 585: datanode.api.v2.TradingDataService.ListAllPositions:output_type -> datanode.api.v2.ListAllPositionsResponse - 49, // 586: datanode.api.v2.TradingDataService.ObservePositions:output_type -> datanode.api.v2.ObservePositionsResponse - 56, // 587: datanode.api.v2.TradingDataService.ListLedgerEntries:output_type -> datanode.api.v2.ListLedgerEntriesResponse - 495, // 588: datanode.api.v2.TradingDataService.ExportLedgerEntries:output_type -> google.api.HttpBody - 60, // 589: datanode.api.v2.TradingDataService.ListBalanceChanges:output_type -> datanode.api.v2.ListBalanceChangesResponse - 78, // 590: datanode.api.v2.TradingDataService.GetLatestMarketData:output_type -> datanode.api.v2.GetLatestMarketDataResponse - 76, // 591: datanode.api.v2.TradingDataService.ListLatestMarketData:output_type -> datanode.api.v2.ListLatestMarketDataResponse - 74, // 592: datanode.api.v2.TradingDataService.GetLatestMarketDepth:output_type -> datanode.api.v2.GetLatestMarketDepthResponse - 68, // 593: datanode.api.v2.TradingDataService.ObserveMarketsDepth:output_type -> datanode.api.v2.ObserveMarketsDepthResponse - 70, // 594: datanode.api.v2.TradingDataService.ObserveMarketsDepthUpdates:output_type -> datanode.api.v2.ObserveMarketsDepthUpdatesResponse - 72, // 595: datanode.api.v2.TradingDataService.ObserveMarketsData:output_type -> datanode.api.v2.ObserveMarketsDataResponse - 80, // 596: datanode.api.v2.TradingDataService.GetMarketDataHistoryByID:output_type -> datanode.api.v2.GetMarketDataHistoryByIDResponse - 84, // 597: datanode.api.v2.TradingDataService.ListTransfers:output_type -> datanode.api.v2.ListTransfersResponse - 89, // 598: datanode.api.v2.TradingDataService.GetTransfer:output_type -> datanode.api.v2.GetTransferResponse - 91, // 599: datanode.api.v2.TradingDataService.GetNetworkLimits:output_type -> datanode.api.v2.GetNetworkLimitsResponse - 99, // 600: datanode.api.v2.TradingDataService.ListCandleData:output_type -> datanode.api.v2.ListCandleDataResponse - 97, // 601: datanode.api.v2.TradingDataService.ObserveCandleData:output_type -> datanode.api.v2.ObserveCandleDataResponse - 94, // 602: datanode.api.v2.TradingDataService.ListCandleIntervals:output_type -> datanode.api.v2.ListCandleIntervalsResponse - 103, // 603: datanode.api.v2.TradingDataService.ListVotes:output_type -> datanode.api.v2.ListVotesResponse - 107, // 604: datanode.api.v2.TradingDataService.ObserveVotes:output_type -> datanode.api.v2.ObserveVotesResponse - 109, // 605: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerAddedBundles:output_type -> datanode.api.v2.ListERC20MultiSigSignerAddedBundlesResponse - 115, // 606: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerRemovedBundles:output_type -> datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesResponse - 121, // 607: datanode.api.v2.TradingDataService.GetERC20ListAssetBundle:output_type -> datanode.api.v2.GetERC20ListAssetBundleResponse - 123, // 608: datanode.api.v2.TradingDataService.GetERC20SetAssetLimitsBundle:output_type -> datanode.api.v2.GetERC20SetAssetLimitsBundleResponse - 125, // 609: datanode.api.v2.TradingDataService.GetERC20WithdrawalApproval:output_type -> datanode.api.v2.GetERC20WithdrawalApprovalResponse - 127, // 610: datanode.api.v2.TradingDataService.GetLastTrade:output_type -> datanode.api.v2.GetLastTradeResponse - 129, // 611: datanode.api.v2.TradingDataService.ListTrades:output_type -> datanode.api.v2.ListTradesResponse - 133, // 612: datanode.api.v2.TradingDataService.ObserveTrades:output_type -> datanode.api.v2.ObserveTradesResponse - 135, // 613: datanode.api.v2.TradingDataService.GetOracleSpec:output_type -> datanode.api.v2.GetOracleSpecResponse - 137, // 614: datanode.api.v2.TradingDataService.ListOracleSpecs:output_type -> datanode.api.v2.ListOracleSpecsResponse - 139, // 615: datanode.api.v2.TradingDataService.ListOracleData:output_type -> datanode.api.v2.ListOracleDataResponse - 145, // 616: datanode.api.v2.TradingDataService.GetMarket:output_type -> datanode.api.v2.GetMarketResponse - 147, // 617: datanode.api.v2.TradingDataService.ListMarkets:output_type -> datanode.api.v2.ListMarketsResponse - 154, // 618: datanode.api.v2.TradingDataService.ListSuccessorMarkets:output_type -> datanode.api.v2.ListSuccessorMarketsResponse - 156, // 619: datanode.api.v2.TradingDataService.GetParty:output_type -> datanode.api.v2.GetPartyResponse - 158, // 620: datanode.api.v2.TradingDataService.ListParties:output_type -> datanode.api.v2.ListPartiesResponse - 162, // 621: datanode.api.v2.TradingDataService.ListPartiesProfiles:output_type -> datanode.api.v2.ListPartiesProfilesResponse - 167, // 622: datanode.api.v2.TradingDataService.ListMarginLevels:output_type -> datanode.api.v2.ListMarginLevelsResponse - 169, // 623: datanode.api.v2.TradingDataService.ObserveMarginLevels:output_type -> datanode.api.v2.ObserveMarginLevelsResponse - 174, // 624: datanode.api.v2.TradingDataService.ListRewards:output_type -> datanode.api.v2.ListRewardsResponse - 178, // 625: datanode.api.v2.TradingDataService.ListRewardSummaries:output_type -> datanode.api.v2.ListRewardSummariesResponse - 181, // 626: datanode.api.v2.TradingDataService.ListEpochRewardSummaries:output_type -> datanode.api.v2.ListEpochRewardSummariesResponse - 187, // 627: datanode.api.v2.TradingDataService.GetDeposit:output_type -> datanode.api.v2.GetDepositResponse - 189, // 628: datanode.api.v2.TradingDataService.ListDeposits:output_type -> datanode.api.v2.ListDepositsResponse - 193, // 629: datanode.api.v2.TradingDataService.GetWithdrawal:output_type -> datanode.api.v2.GetWithdrawalResponse - 195, // 630: datanode.api.v2.TradingDataService.ListWithdrawals:output_type -> datanode.api.v2.ListWithdrawalsResponse - 199, // 631: datanode.api.v2.TradingDataService.GetAsset:output_type -> datanode.api.v2.GetAssetResponse - 201, // 632: datanode.api.v2.TradingDataService.ListAssets:output_type -> datanode.api.v2.ListAssetsResponse - 206, // 633: datanode.api.v2.TradingDataService.ListLiquidityProvisions:output_type -> datanode.api.v2.ListLiquidityProvisionsResponse - 207, // 634: datanode.api.v2.TradingDataService.ListAllLiquidityProvisions:output_type -> datanode.api.v2.ListAllLiquidityProvisionsResponse - 214, // 635: datanode.api.v2.TradingDataService.ObserveLiquidityProvisions:output_type -> datanode.api.v2.ObserveLiquidityProvisionsResponse - 219, // 636: datanode.api.v2.TradingDataService.ListLiquidityProviders:output_type -> datanode.api.v2.ListLiquidityProvidersResponse - 221, // 637: datanode.api.v2.TradingDataService.ListPaidLiquidityFees:output_type -> datanode.api.v2.ListPaidLiquidityFeesResponse - 225, // 638: datanode.api.v2.TradingDataService.GetGovernanceData:output_type -> datanode.api.v2.GetGovernanceDataResponse - 227, // 639: datanode.api.v2.TradingDataService.ListGovernanceData:output_type -> datanode.api.v2.ListGovernanceDataResponse - 231, // 640: datanode.api.v2.TradingDataService.ObserveGovernance:output_type -> datanode.api.v2.ObserveGovernanceResponse - 233, // 641: datanode.api.v2.TradingDataService.ListDelegations:output_type -> datanode.api.v2.ListDelegationsResponse - 240, // 642: datanode.api.v2.TradingDataService.GetNetworkData:output_type -> datanode.api.v2.GetNetworkDataResponse - 242, // 643: datanode.api.v2.TradingDataService.GetNode:output_type -> datanode.api.v2.GetNodeResponse - 244, // 644: datanode.api.v2.TradingDataService.ListNodes:output_type -> datanode.api.v2.ListNodesResponse - 248, // 645: datanode.api.v2.TradingDataService.ListNodeSignatures:output_type -> datanode.api.v2.ListNodeSignaturesResponse - 252, // 646: datanode.api.v2.TradingDataService.GetEpoch:output_type -> datanode.api.v2.GetEpochResponse - 254, // 647: datanode.api.v2.TradingDataService.EstimateFee:output_type -> datanode.api.v2.EstimateFeeResponse - 256, // 648: datanode.api.v2.TradingDataService.EstimateMargin:output_type -> datanode.api.v2.EstimateMarginResponse - 332, // 649: datanode.api.v2.TradingDataService.EstimatePosition:output_type -> datanode.api.v2.EstimatePositionResponse - 258, // 650: datanode.api.v2.TradingDataService.ListNetworkParameters:output_type -> datanode.api.v2.ListNetworkParametersResponse - 260, // 651: datanode.api.v2.TradingDataService.GetNetworkParameter:output_type -> datanode.api.v2.GetNetworkParameterResponse - 265, // 652: datanode.api.v2.TradingDataService.ListCheckpoints:output_type -> datanode.api.v2.ListCheckpointsResponse - 269, // 653: datanode.api.v2.TradingDataService.GetStake:output_type -> datanode.api.v2.GetStakeResponse - 273, // 654: datanode.api.v2.TradingDataService.GetRiskFactors:output_type -> datanode.api.v2.GetRiskFactorsResponse - 275, // 655: datanode.api.v2.TradingDataService.ObserveEventBus:output_type -> datanode.api.v2.ObserveEventBusResponse - 277, // 656: datanode.api.v2.TradingDataService.ObserveLedgerMovements:output_type -> datanode.api.v2.ObserveLedgerMovementsResponse - 279, // 657: datanode.api.v2.TradingDataService.ListKeyRotations:output_type -> datanode.api.v2.ListKeyRotationsResponse - 283, // 658: datanode.api.v2.TradingDataService.ListEthereumKeyRotations:output_type -> datanode.api.v2.ListEthereumKeyRotationsResponse - 287, // 659: datanode.api.v2.TradingDataService.GetVegaTime:output_type -> datanode.api.v2.GetVegaTimeResponse - 290, // 660: datanode.api.v2.TradingDataService.GetProtocolUpgradeStatus:output_type -> datanode.api.v2.GetProtocolUpgradeStatusResponse - 292, // 661: datanode.api.v2.TradingDataService.ListProtocolUpgradeProposals:output_type -> datanode.api.v2.ListProtocolUpgradeProposalsResponse - 296, // 662: datanode.api.v2.TradingDataService.ListCoreSnapshots:output_type -> datanode.api.v2.ListCoreSnapshotsResponse - 301, // 663: datanode.api.v2.TradingDataService.GetMostRecentNetworkHistorySegment:output_type -> datanode.api.v2.GetMostRecentNetworkHistorySegmentResponse - 303, // 664: datanode.api.v2.TradingDataService.ListAllNetworkHistorySegments:output_type -> datanode.api.v2.ListAllNetworkHistorySegmentsResponse - 305, // 665: datanode.api.v2.TradingDataService.GetActiveNetworkHistoryPeerAddresses:output_type -> datanode.api.v2.GetActiveNetworkHistoryPeerAddressesResponse - 307, // 666: datanode.api.v2.TradingDataService.GetNetworkHistoryStatus:output_type -> datanode.api.v2.GetNetworkHistoryStatusResponse - 309, // 667: datanode.api.v2.TradingDataService.GetNetworkHistoryBootstrapPeers:output_type -> datanode.api.v2.GetNetworkHistoryBootstrapPeersResponse - 312, // 668: datanode.api.v2.TradingDataService.ListEntities:output_type -> datanode.api.v2.ListEntitiesResponse - 323, // 669: datanode.api.v2.TradingDataService.ListFundingPeriods:output_type -> datanode.api.v2.ListFundingPeriodsResponse - 327, // 670: datanode.api.v2.TradingDataService.ListFundingPeriodDataPoints:output_type -> datanode.api.v2.ListFundingPeriodDataPointsResponse - 319, // 671: datanode.api.v2.TradingDataService.ListFundingPayments:output_type -> datanode.api.v2.ListFundingPaymentsResponse - 314, // 672: datanode.api.v2.TradingDataService.GetPartyActivityStreak:output_type -> datanode.api.v2.GetPartyActivityStreakResponse - 338, // 673: datanode.api.v2.TradingDataService.GetCurrentReferralProgram:output_type -> datanode.api.v2.GetCurrentReferralProgramResponse - 344, // 674: datanode.api.v2.TradingDataService.ListReferralSets:output_type -> datanode.api.v2.ListReferralSetsResponse - 349, // 675: datanode.api.v2.TradingDataService.ListReferralSetReferees:output_type -> datanode.api.v2.ListReferralSetRefereesResponse - 351, // 676: datanode.api.v2.TradingDataService.GetReferralSetStats:output_type -> datanode.api.v2.GetReferralSetStatsResponse - 359, // 677: datanode.api.v2.TradingDataService.ListTeams:output_type -> datanode.api.v2.ListTeamsResponse - 361, // 678: datanode.api.v2.TradingDataService.ListTeamsStatistics:output_type -> datanode.api.v2.ListTeamsStatisticsResponse - 368, // 679: datanode.api.v2.TradingDataService.ListTeamMembersStatistics:output_type -> datanode.api.v2.ListTeamMembersStatisticsResponse - 376, // 680: datanode.api.v2.TradingDataService.ListTeamReferees:output_type -> datanode.api.v2.ListTeamRefereesResponse - 381, // 681: datanode.api.v2.TradingDataService.ListTeamRefereeHistory:output_type -> datanode.api.v2.ListTeamRefereeHistoryResponse - 383, // 682: datanode.api.v2.TradingDataService.GetFeesStats:output_type -> datanode.api.v2.GetFeesStatsResponse - 385, // 683: datanode.api.v2.TradingDataService.GetFeesStatsForParty:output_type -> datanode.api.v2.GetFeesStatsForPartyResponse - 387, // 684: datanode.api.v2.TradingDataService.GetCurrentVolumeDiscountProgram:output_type -> datanode.api.v2.GetCurrentVolumeDiscountProgramResponse - 389, // 685: datanode.api.v2.TradingDataService.GetVolumeDiscountStats:output_type -> datanode.api.v2.GetVolumeDiscountStatsResponse - 11, // 686: datanode.api.v2.TradingDataService.GetVestingBalancesSummary:output_type -> datanode.api.v2.GetVestingBalancesSummaryResponse - 9, // 687: datanode.api.v2.TradingDataService.GetPartyVestingStats:output_type -> datanode.api.v2.GetPartyVestingStatsResponse - 396, // 688: datanode.api.v2.TradingDataService.ObserveTransactionResults:output_type -> datanode.api.v2.ObserveTransactionResultsResponse - 398, // 689: datanode.api.v2.TradingDataService.EstimateTransferFee:output_type -> datanode.api.v2.EstimateTransferFeeResponse - 400, // 690: datanode.api.v2.TradingDataService.GetTotalTransferFeeDiscount:output_type -> datanode.api.v2.GetTotalTransferFeeDiscountResponse - 402, // 691: datanode.api.v2.TradingDataService.ListGames:output_type -> datanode.api.v2.ListGamesResponse - 412, // 692: datanode.api.v2.TradingDataService.ListPartyMarginModes:output_type -> datanode.api.v2.ListPartyMarginModesResponse - 418, // 693: datanode.api.v2.TradingDataService.GetTimeWeightedNotionalPosition:output_type -> datanode.api.v2.GetTimeWeightedNotionalPositionResponse - 495, // 694: datanode.api.v2.TradingDataService.ExportNetworkHistory:output_type -> google.api.HttpBody - 329, // 695: datanode.api.v2.TradingDataService.Ping:output_type -> datanode.api.v2.PingResponse - 575, // [575:696] is the sub-list for method output_type - 454, // [454:575] is the sub-list for method input_type - 454, // [454:454] is the sub-list for extension type_name - 454, // [454:454] is the sub-list for extension extendee - 0, // [0:454] is the sub-list for field type_name + 499, // 454: datanode.api.v2.ListAMMPoolsRequest.status:type_name -> vega.events.v1.AMMPool.Status + 6, // 455: datanode.api.v2.ListAMMPoolsRequest.pagination:type_name -> datanode.api.v2.Pagination + 421, // 456: datanode.api.v2.ListAMMPoolsResponse.amm_pools:type_name -> datanode.api.v2.AMMPoolsConnection + 422, // 457: datanode.api.v2.AMMPoolsConnection.edges:type_name -> datanode.api.v2.AMMPoolEdge + 7, // 458: datanode.api.v2.AMMPoolsConnection.page_info:type_name -> datanode.api.v2.PageInfo + 500, // 459: datanode.api.v2.AMMPoolEdge.node:type_name -> vega.events.v1.AMMPool + 13, // 460: datanode.api.v2.TradingDataService.ListAccounts:input_type -> datanode.api.v2.ListAccountsRequest + 17, // 461: datanode.api.v2.TradingDataService.ObserveAccounts:input_type -> datanode.api.v2.ObserveAccountsRequest + 21, // 462: datanode.api.v2.TradingDataService.Info:input_type -> datanode.api.v2.InfoRequest + 23, // 463: datanode.api.v2.TradingDataService.GetOrder:input_type -> datanode.api.v2.GetOrderRequest + 26, // 464: datanode.api.v2.TradingDataService.ListOrders:input_type -> datanode.api.v2.ListOrdersRequest + 28, // 465: datanode.api.v2.TradingDataService.ListOrderVersions:input_type -> datanode.api.v2.ListOrderVersionsRequest + 30, // 466: datanode.api.v2.TradingDataService.ObserveOrders:input_type -> datanode.api.v2.ObserveOrdersRequest + 34, // 467: datanode.api.v2.TradingDataService.GetStopOrder:input_type -> datanode.api.v2.GetStopOrderRequest + 36, // 468: datanode.api.v2.TradingDataService.ListStopOrders:input_type -> datanode.api.v2.ListStopOrdersRequest + 41, // 469: datanode.api.v2.TradingDataService.ListPositions:input_type -> datanode.api.v2.ListPositionsRequest + 44, // 470: datanode.api.v2.TradingDataService.ListAllPositions:input_type -> datanode.api.v2.ListAllPositionsRequest + 48, // 471: datanode.api.v2.TradingDataService.ObservePositions:input_type -> datanode.api.v2.ObservePositionsRequest + 54, // 472: datanode.api.v2.TradingDataService.ListLedgerEntries:input_type -> datanode.api.v2.ListLedgerEntriesRequest + 55, // 473: datanode.api.v2.TradingDataService.ExportLedgerEntries:input_type -> datanode.api.v2.ExportLedgerEntriesRequest + 59, // 474: datanode.api.v2.TradingDataService.ListBalanceChanges:input_type -> datanode.api.v2.ListBalanceChangesRequest + 77, // 475: datanode.api.v2.TradingDataService.GetLatestMarketData:input_type -> datanode.api.v2.GetLatestMarketDataRequest + 75, // 476: datanode.api.v2.TradingDataService.ListLatestMarketData:input_type -> datanode.api.v2.ListLatestMarketDataRequest + 73, // 477: datanode.api.v2.TradingDataService.GetLatestMarketDepth:input_type -> datanode.api.v2.GetLatestMarketDepthRequest + 67, // 478: datanode.api.v2.TradingDataService.ObserveMarketsDepth:input_type -> datanode.api.v2.ObserveMarketsDepthRequest + 69, // 479: datanode.api.v2.TradingDataService.ObserveMarketsDepthUpdates:input_type -> datanode.api.v2.ObserveMarketsDepthUpdatesRequest + 71, // 480: datanode.api.v2.TradingDataService.ObserveMarketsData:input_type -> datanode.api.v2.ObserveMarketsDataRequest + 79, // 481: datanode.api.v2.TradingDataService.GetMarketDataHistoryByID:input_type -> datanode.api.v2.GetMarketDataHistoryByIDRequest + 83, // 482: datanode.api.v2.TradingDataService.ListTransfers:input_type -> datanode.api.v2.ListTransfersRequest + 88, // 483: datanode.api.v2.TradingDataService.GetTransfer:input_type -> datanode.api.v2.GetTransferRequest + 90, // 484: datanode.api.v2.TradingDataService.GetNetworkLimits:input_type -> datanode.api.v2.GetNetworkLimitsRequest + 98, // 485: datanode.api.v2.TradingDataService.ListCandleData:input_type -> datanode.api.v2.ListCandleDataRequest + 96, // 486: datanode.api.v2.TradingDataService.ObserveCandleData:input_type -> datanode.api.v2.ObserveCandleDataRequest + 92, // 487: datanode.api.v2.TradingDataService.ListCandleIntervals:input_type -> datanode.api.v2.ListCandleIntervalsRequest + 102, // 488: datanode.api.v2.TradingDataService.ListVotes:input_type -> datanode.api.v2.ListVotesRequest + 106, // 489: datanode.api.v2.TradingDataService.ObserveVotes:input_type -> datanode.api.v2.ObserveVotesRequest + 108, // 490: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerAddedBundles:input_type -> datanode.api.v2.ListERC20MultiSigSignerAddedBundlesRequest + 114, // 491: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerRemovedBundles:input_type -> datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesRequest + 120, // 492: datanode.api.v2.TradingDataService.GetERC20ListAssetBundle:input_type -> datanode.api.v2.GetERC20ListAssetBundleRequest + 122, // 493: datanode.api.v2.TradingDataService.GetERC20SetAssetLimitsBundle:input_type -> datanode.api.v2.GetERC20SetAssetLimitsBundleRequest + 124, // 494: datanode.api.v2.TradingDataService.GetERC20WithdrawalApproval:input_type -> datanode.api.v2.GetERC20WithdrawalApprovalRequest + 126, // 495: datanode.api.v2.TradingDataService.GetLastTrade:input_type -> datanode.api.v2.GetLastTradeRequest + 128, // 496: datanode.api.v2.TradingDataService.ListTrades:input_type -> datanode.api.v2.ListTradesRequest + 132, // 497: datanode.api.v2.TradingDataService.ObserveTrades:input_type -> datanode.api.v2.ObserveTradesRequest + 134, // 498: datanode.api.v2.TradingDataService.GetOracleSpec:input_type -> datanode.api.v2.GetOracleSpecRequest + 136, // 499: datanode.api.v2.TradingDataService.ListOracleSpecs:input_type -> datanode.api.v2.ListOracleSpecsRequest + 138, // 500: datanode.api.v2.TradingDataService.ListOracleData:input_type -> datanode.api.v2.ListOracleDataRequest + 144, // 501: datanode.api.v2.TradingDataService.GetMarket:input_type -> datanode.api.v2.GetMarketRequest + 146, // 502: datanode.api.v2.TradingDataService.ListMarkets:input_type -> datanode.api.v2.ListMarketsRequest + 150, // 503: datanode.api.v2.TradingDataService.ListSuccessorMarkets:input_type -> datanode.api.v2.ListSuccessorMarketsRequest + 155, // 504: datanode.api.v2.TradingDataService.GetParty:input_type -> datanode.api.v2.GetPartyRequest + 157, // 505: datanode.api.v2.TradingDataService.ListParties:input_type -> datanode.api.v2.ListPartiesRequest + 161, // 506: datanode.api.v2.TradingDataService.ListPartiesProfiles:input_type -> datanode.api.v2.ListPartiesProfilesRequest + 166, // 507: datanode.api.v2.TradingDataService.ListMarginLevels:input_type -> datanode.api.v2.ListMarginLevelsRequest + 168, // 508: datanode.api.v2.TradingDataService.ObserveMarginLevels:input_type -> datanode.api.v2.ObserveMarginLevelsRequest + 173, // 509: datanode.api.v2.TradingDataService.ListRewards:input_type -> datanode.api.v2.ListRewardsRequest + 177, // 510: datanode.api.v2.TradingDataService.ListRewardSummaries:input_type -> datanode.api.v2.ListRewardSummariesRequest + 180, // 511: datanode.api.v2.TradingDataService.ListEpochRewardSummaries:input_type -> datanode.api.v2.ListEpochRewardSummariesRequest + 186, // 512: datanode.api.v2.TradingDataService.GetDeposit:input_type -> datanode.api.v2.GetDepositRequest + 188, // 513: datanode.api.v2.TradingDataService.ListDeposits:input_type -> datanode.api.v2.ListDepositsRequest + 192, // 514: datanode.api.v2.TradingDataService.GetWithdrawal:input_type -> datanode.api.v2.GetWithdrawalRequest + 194, // 515: datanode.api.v2.TradingDataService.ListWithdrawals:input_type -> datanode.api.v2.ListWithdrawalsRequest + 198, // 516: datanode.api.v2.TradingDataService.GetAsset:input_type -> datanode.api.v2.GetAssetRequest + 200, // 517: datanode.api.v2.TradingDataService.ListAssets:input_type -> datanode.api.v2.ListAssetsRequest + 204, // 518: datanode.api.v2.TradingDataService.ListLiquidityProvisions:input_type -> datanode.api.v2.ListLiquidityProvisionsRequest + 205, // 519: datanode.api.v2.TradingDataService.ListAllLiquidityProvisions:input_type -> datanode.api.v2.ListAllLiquidityProvisionsRequest + 213, // 520: datanode.api.v2.TradingDataService.ObserveLiquidityProvisions:input_type -> datanode.api.v2.ObserveLiquidityProvisionsRequest + 215, // 521: datanode.api.v2.TradingDataService.ListLiquidityProviders:input_type -> datanode.api.v2.ListLiquidityProvidersRequest + 220, // 522: datanode.api.v2.TradingDataService.ListPaidLiquidityFees:input_type -> datanode.api.v2.ListPaidLiquidityFeesRequest + 224, // 523: datanode.api.v2.TradingDataService.GetGovernanceData:input_type -> datanode.api.v2.GetGovernanceDataRequest + 226, // 524: datanode.api.v2.TradingDataService.ListGovernanceData:input_type -> datanode.api.v2.ListGovernanceDataRequest + 230, // 525: datanode.api.v2.TradingDataService.ObserveGovernance:input_type -> datanode.api.v2.ObserveGovernanceRequest + 232, // 526: datanode.api.v2.TradingDataService.ListDelegations:input_type -> datanode.api.v2.ListDelegationsRequest + 239, // 527: datanode.api.v2.TradingDataService.GetNetworkData:input_type -> datanode.api.v2.GetNetworkDataRequest + 241, // 528: datanode.api.v2.TradingDataService.GetNode:input_type -> datanode.api.v2.GetNodeRequest + 243, // 529: datanode.api.v2.TradingDataService.ListNodes:input_type -> datanode.api.v2.ListNodesRequest + 247, // 530: datanode.api.v2.TradingDataService.ListNodeSignatures:input_type -> datanode.api.v2.ListNodeSignaturesRequest + 251, // 531: datanode.api.v2.TradingDataService.GetEpoch:input_type -> datanode.api.v2.GetEpochRequest + 253, // 532: datanode.api.v2.TradingDataService.EstimateFee:input_type -> datanode.api.v2.EstimateFeeRequest + 255, // 533: datanode.api.v2.TradingDataService.EstimateMargin:input_type -> datanode.api.v2.EstimateMarginRequest + 331, // 534: datanode.api.v2.TradingDataService.EstimatePosition:input_type -> datanode.api.v2.EstimatePositionRequest + 257, // 535: datanode.api.v2.TradingDataService.ListNetworkParameters:input_type -> datanode.api.v2.ListNetworkParametersRequest + 259, // 536: datanode.api.v2.TradingDataService.GetNetworkParameter:input_type -> datanode.api.v2.GetNetworkParameterRequest + 264, // 537: datanode.api.v2.TradingDataService.ListCheckpoints:input_type -> datanode.api.v2.ListCheckpointsRequest + 268, // 538: datanode.api.v2.TradingDataService.GetStake:input_type -> datanode.api.v2.GetStakeRequest + 272, // 539: datanode.api.v2.TradingDataService.GetRiskFactors:input_type -> datanode.api.v2.GetRiskFactorsRequest + 274, // 540: datanode.api.v2.TradingDataService.ObserveEventBus:input_type -> datanode.api.v2.ObserveEventBusRequest + 276, // 541: datanode.api.v2.TradingDataService.ObserveLedgerMovements:input_type -> datanode.api.v2.ObserveLedgerMovementsRequest + 278, // 542: datanode.api.v2.TradingDataService.ListKeyRotations:input_type -> datanode.api.v2.ListKeyRotationsRequest + 282, // 543: datanode.api.v2.TradingDataService.ListEthereumKeyRotations:input_type -> datanode.api.v2.ListEthereumKeyRotationsRequest + 286, // 544: datanode.api.v2.TradingDataService.GetVegaTime:input_type -> datanode.api.v2.GetVegaTimeRequest + 289, // 545: datanode.api.v2.TradingDataService.GetProtocolUpgradeStatus:input_type -> datanode.api.v2.GetProtocolUpgradeStatusRequest + 291, // 546: datanode.api.v2.TradingDataService.ListProtocolUpgradeProposals:input_type -> datanode.api.v2.ListProtocolUpgradeProposalsRequest + 295, // 547: datanode.api.v2.TradingDataService.ListCoreSnapshots:input_type -> datanode.api.v2.ListCoreSnapshotsRequest + 300, // 548: datanode.api.v2.TradingDataService.GetMostRecentNetworkHistorySegment:input_type -> datanode.api.v2.GetMostRecentNetworkHistorySegmentRequest + 302, // 549: datanode.api.v2.TradingDataService.ListAllNetworkHistorySegments:input_type -> datanode.api.v2.ListAllNetworkHistorySegmentsRequest + 304, // 550: datanode.api.v2.TradingDataService.GetActiveNetworkHistoryPeerAddresses:input_type -> datanode.api.v2.GetActiveNetworkHistoryPeerAddressesRequest + 306, // 551: datanode.api.v2.TradingDataService.GetNetworkHistoryStatus:input_type -> datanode.api.v2.GetNetworkHistoryStatusRequest + 308, // 552: datanode.api.v2.TradingDataService.GetNetworkHistoryBootstrapPeers:input_type -> datanode.api.v2.GetNetworkHistoryBootstrapPeersRequest + 311, // 553: datanode.api.v2.TradingDataService.ListEntities:input_type -> datanode.api.v2.ListEntitiesRequest + 320, // 554: datanode.api.v2.TradingDataService.ListFundingPeriods:input_type -> datanode.api.v2.ListFundingPeriodsRequest + 324, // 555: datanode.api.v2.TradingDataService.ListFundingPeriodDataPoints:input_type -> datanode.api.v2.ListFundingPeriodDataPointsRequest + 316, // 556: datanode.api.v2.TradingDataService.ListFundingPayments:input_type -> datanode.api.v2.ListFundingPaymentsRequest + 313, // 557: datanode.api.v2.TradingDataService.GetPartyActivityStreak:input_type -> datanode.api.v2.GetPartyActivityStreakRequest + 337, // 558: datanode.api.v2.TradingDataService.GetCurrentReferralProgram:input_type -> datanode.api.v2.GetCurrentReferralProgramRequest + 343, // 559: datanode.api.v2.TradingDataService.ListReferralSets:input_type -> datanode.api.v2.ListReferralSetsRequest + 348, // 560: datanode.api.v2.TradingDataService.ListReferralSetReferees:input_type -> datanode.api.v2.ListReferralSetRefereesRequest + 350, // 561: datanode.api.v2.TradingDataService.GetReferralSetStats:input_type -> datanode.api.v2.GetReferralSetStatsRequest + 358, // 562: datanode.api.v2.TradingDataService.ListTeams:input_type -> datanode.api.v2.ListTeamsRequest + 360, // 563: datanode.api.v2.TradingDataService.ListTeamsStatistics:input_type -> datanode.api.v2.ListTeamsStatisticsRequest + 367, // 564: datanode.api.v2.TradingDataService.ListTeamMembersStatistics:input_type -> datanode.api.v2.ListTeamMembersStatisticsRequest + 372, // 565: datanode.api.v2.TradingDataService.ListTeamReferees:input_type -> datanode.api.v2.ListTeamRefereesRequest + 380, // 566: datanode.api.v2.TradingDataService.ListTeamRefereeHistory:input_type -> datanode.api.v2.ListTeamRefereeHistoryRequest + 382, // 567: datanode.api.v2.TradingDataService.GetFeesStats:input_type -> datanode.api.v2.GetFeesStatsRequest + 384, // 568: datanode.api.v2.TradingDataService.GetFeesStatsForParty:input_type -> datanode.api.v2.GetFeesStatsForPartyRequest + 386, // 569: datanode.api.v2.TradingDataService.GetCurrentVolumeDiscountProgram:input_type -> datanode.api.v2.GetCurrentVolumeDiscountProgramRequest + 388, // 570: datanode.api.v2.TradingDataService.GetVolumeDiscountStats:input_type -> datanode.api.v2.GetVolumeDiscountStatsRequest + 10, // 571: datanode.api.v2.TradingDataService.GetVestingBalancesSummary:input_type -> datanode.api.v2.GetVestingBalancesSummaryRequest + 8, // 572: datanode.api.v2.TradingDataService.GetPartyVestingStats:input_type -> datanode.api.v2.GetPartyVestingStatsRequest + 395, // 573: datanode.api.v2.TradingDataService.ObserveTransactionResults:input_type -> datanode.api.v2.ObserveTransactionResultsRequest + 397, // 574: datanode.api.v2.TradingDataService.EstimateTransferFee:input_type -> datanode.api.v2.EstimateTransferFeeRequest + 399, // 575: datanode.api.v2.TradingDataService.GetTotalTransferFeeDiscount:input_type -> datanode.api.v2.GetTotalTransferFeeDiscountRequest + 401, // 576: datanode.api.v2.TradingDataService.ListGames:input_type -> datanode.api.v2.ListGamesRequest + 411, // 577: datanode.api.v2.TradingDataService.ListPartyMarginModes:input_type -> datanode.api.v2.ListPartyMarginModesRequest + 417, // 578: datanode.api.v2.TradingDataService.GetTimeWeightedNotionalPosition:input_type -> datanode.api.v2.GetTimeWeightedNotionalPositionRequest + 419, // 579: datanode.api.v2.TradingDataService.ListAMMPools:input_type -> datanode.api.v2.ListAMMPoolsRequest + 310, // 580: datanode.api.v2.TradingDataService.ExportNetworkHistory:input_type -> datanode.api.v2.ExportNetworkHistoryRequest + 328, // 581: datanode.api.v2.TradingDataService.Ping:input_type -> datanode.api.v2.PingRequest + 14, // 582: datanode.api.v2.TradingDataService.ListAccounts:output_type -> datanode.api.v2.ListAccountsResponse + 18, // 583: datanode.api.v2.TradingDataService.ObserveAccounts:output_type -> datanode.api.v2.ObserveAccountsResponse + 22, // 584: datanode.api.v2.TradingDataService.Info:output_type -> datanode.api.v2.InfoResponse + 24, // 585: datanode.api.v2.TradingDataService.GetOrder:output_type -> datanode.api.v2.GetOrderResponse + 27, // 586: datanode.api.v2.TradingDataService.ListOrders:output_type -> datanode.api.v2.ListOrdersResponse + 29, // 587: datanode.api.v2.TradingDataService.ListOrderVersions:output_type -> datanode.api.v2.ListOrderVersionsResponse + 31, // 588: datanode.api.v2.TradingDataService.ObserveOrders:output_type -> datanode.api.v2.ObserveOrdersResponse + 35, // 589: datanode.api.v2.TradingDataService.GetStopOrder:output_type -> datanode.api.v2.GetStopOrderResponse + 40, // 590: datanode.api.v2.TradingDataService.ListStopOrders:output_type -> datanode.api.v2.ListStopOrdersResponse + 42, // 591: datanode.api.v2.TradingDataService.ListPositions:output_type -> datanode.api.v2.ListPositionsResponse + 45, // 592: datanode.api.v2.TradingDataService.ListAllPositions:output_type -> datanode.api.v2.ListAllPositionsResponse + 49, // 593: datanode.api.v2.TradingDataService.ObservePositions:output_type -> datanode.api.v2.ObservePositionsResponse + 56, // 594: datanode.api.v2.TradingDataService.ListLedgerEntries:output_type -> datanode.api.v2.ListLedgerEntriesResponse + 501, // 595: datanode.api.v2.TradingDataService.ExportLedgerEntries:output_type -> google.api.HttpBody + 60, // 596: datanode.api.v2.TradingDataService.ListBalanceChanges:output_type -> datanode.api.v2.ListBalanceChangesResponse + 78, // 597: datanode.api.v2.TradingDataService.GetLatestMarketData:output_type -> datanode.api.v2.GetLatestMarketDataResponse + 76, // 598: datanode.api.v2.TradingDataService.ListLatestMarketData:output_type -> datanode.api.v2.ListLatestMarketDataResponse + 74, // 599: datanode.api.v2.TradingDataService.GetLatestMarketDepth:output_type -> datanode.api.v2.GetLatestMarketDepthResponse + 68, // 600: datanode.api.v2.TradingDataService.ObserveMarketsDepth:output_type -> datanode.api.v2.ObserveMarketsDepthResponse + 70, // 601: datanode.api.v2.TradingDataService.ObserveMarketsDepthUpdates:output_type -> datanode.api.v2.ObserveMarketsDepthUpdatesResponse + 72, // 602: datanode.api.v2.TradingDataService.ObserveMarketsData:output_type -> datanode.api.v2.ObserveMarketsDataResponse + 80, // 603: datanode.api.v2.TradingDataService.GetMarketDataHistoryByID:output_type -> datanode.api.v2.GetMarketDataHistoryByIDResponse + 84, // 604: datanode.api.v2.TradingDataService.ListTransfers:output_type -> datanode.api.v2.ListTransfersResponse + 89, // 605: datanode.api.v2.TradingDataService.GetTransfer:output_type -> datanode.api.v2.GetTransferResponse + 91, // 606: datanode.api.v2.TradingDataService.GetNetworkLimits:output_type -> datanode.api.v2.GetNetworkLimitsResponse + 99, // 607: datanode.api.v2.TradingDataService.ListCandleData:output_type -> datanode.api.v2.ListCandleDataResponse + 97, // 608: datanode.api.v2.TradingDataService.ObserveCandleData:output_type -> datanode.api.v2.ObserveCandleDataResponse + 94, // 609: datanode.api.v2.TradingDataService.ListCandleIntervals:output_type -> datanode.api.v2.ListCandleIntervalsResponse + 103, // 610: datanode.api.v2.TradingDataService.ListVotes:output_type -> datanode.api.v2.ListVotesResponse + 107, // 611: datanode.api.v2.TradingDataService.ObserveVotes:output_type -> datanode.api.v2.ObserveVotesResponse + 109, // 612: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerAddedBundles:output_type -> datanode.api.v2.ListERC20MultiSigSignerAddedBundlesResponse + 115, // 613: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerRemovedBundles:output_type -> datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesResponse + 121, // 614: datanode.api.v2.TradingDataService.GetERC20ListAssetBundle:output_type -> datanode.api.v2.GetERC20ListAssetBundleResponse + 123, // 615: datanode.api.v2.TradingDataService.GetERC20SetAssetLimitsBundle:output_type -> datanode.api.v2.GetERC20SetAssetLimitsBundleResponse + 125, // 616: datanode.api.v2.TradingDataService.GetERC20WithdrawalApproval:output_type -> datanode.api.v2.GetERC20WithdrawalApprovalResponse + 127, // 617: datanode.api.v2.TradingDataService.GetLastTrade:output_type -> datanode.api.v2.GetLastTradeResponse + 129, // 618: datanode.api.v2.TradingDataService.ListTrades:output_type -> datanode.api.v2.ListTradesResponse + 133, // 619: datanode.api.v2.TradingDataService.ObserveTrades:output_type -> datanode.api.v2.ObserveTradesResponse + 135, // 620: datanode.api.v2.TradingDataService.GetOracleSpec:output_type -> datanode.api.v2.GetOracleSpecResponse + 137, // 621: datanode.api.v2.TradingDataService.ListOracleSpecs:output_type -> datanode.api.v2.ListOracleSpecsResponse + 139, // 622: datanode.api.v2.TradingDataService.ListOracleData:output_type -> datanode.api.v2.ListOracleDataResponse + 145, // 623: datanode.api.v2.TradingDataService.GetMarket:output_type -> datanode.api.v2.GetMarketResponse + 147, // 624: datanode.api.v2.TradingDataService.ListMarkets:output_type -> datanode.api.v2.ListMarketsResponse + 154, // 625: datanode.api.v2.TradingDataService.ListSuccessorMarkets:output_type -> datanode.api.v2.ListSuccessorMarketsResponse + 156, // 626: datanode.api.v2.TradingDataService.GetParty:output_type -> datanode.api.v2.GetPartyResponse + 158, // 627: datanode.api.v2.TradingDataService.ListParties:output_type -> datanode.api.v2.ListPartiesResponse + 162, // 628: datanode.api.v2.TradingDataService.ListPartiesProfiles:output_type -> datanode.api.v2.ListPartiesProfilesResponse + 167, // 629: datanode.api.v2.TradingDataService.ListMarginLevels:output_type -> datanode.api.v2.ListMarginLevelsResponse + 169, // 630: datanode.api.v2.TradingDataService.ObserveMarginLevels:output_type -> datanode.api.v2.ObserveMarginLevelsResponse + 174, // 631: datanode.api.v2.TradingDataService.ListRewards:output_type -> datanode.api.v2.ListRewardsResponse + 178, // 632: datanode.api.v2.TradingDataService.ListRewardSummaries:output_type -> datanode.api.v2.ListRewardSummariesResponse + 181, // 633: datanode.api.v2.TradingDataService.ListEpochRewardSummaries:output_type -> datanode.api.v2.ListEpochRewardSummariesResponse + 187, // 634: datanode.api.v2.TradingDataService.GetDeposit:output_type -> datanode.api.v2.GetDepositResponse + 189, // 635: datanode.api.v2.TradingDataService.ListDeposits:output_type -> datanode.api.v2.ListDepositsResponse + 193, // 636: datanode.api.v2.TradingDataService.GetWithdrawal:output_type -> datanode.api.v2.GetWithdrawalResponse + 195, // 637: datanode.api.v2.TradingDataService.ListWithdrawals:output_type -> datanode.api.v2.ListWithdrawalsResponse + 199, // 638: datanode.api.v2.TradingDataService.GetAsset:output_type -> datanode.api.v2.GetAssetResponse + 201, // 639: datanode.api.v2.TradingDataService.ListAssets:output_type -> datanode.api.v2.ListAssetsResponse + 206, // 640: datanode.api.v2.TradingDataService.ListLiquidityProvisions:output_type -> datanode.api.v2.ListLiquidityProvisionsResponse + 207, // 641: datanode.api.v2.TradingDataService.ListAllLiquidityProvisions:output_type -> datanode.api.v2.ListAllLiquidityProvisionsResponse + 214, // 642: datanode.api.v2.TradingDataService.ObserveLiquidityProvisions:output_type -> datanode.api.v2.ObserveLiquidityProvisionsResponse + 219, // 643: datanode.api.v2.TradingDataService.ListLiquidityProviders:output_type -> datanode.api.v2.ListLiquidityProvidersResponse + 221, // 644: datanode.api.v2.TradingDataService.ListPaidLiquidityFees:output_type -> datanode.api.v2.ListPaidLiquidityFeesResponse + 225, // 645: datanode.api.v2.TradingDataService.GetGovernanceData:output_type -> datanode.api.v2.GetGovernanceDataResponse + 227, // 646: datanode.api.v2.TradingDataService.ListGovernanceData:output_type -> datanode.api.v2.ListGovernanceDataResponse + 231, // 647: datanode.api.v2.TradingDataService.ObserveGovernance:output_type -> datanode.api.v2.ObserveGovernanceResponse + 233, // 648: datanode.api.v2.TradingDataService.ListDelegations:output_type -> datanode.api.v2.ListDelegationsResponse + 240, // 649: datanode.api.v2.TradingDataService.GetNetworkData:output_type -> datanode.api.v2.GetNetworkDataResponse + 242, // 650: datanode.api.v2.TradingDataService.GetNode:output_type -> datanode.api.v2.GetNodeResponse + 244, // 651: datanode.api.v2.TradingDataService.ListNodes:output_type -> datanode.api.v2.ListNodesResponse + 248, // 652: datanode.api.v2.TradingDataService.ListNodeSignatures:output_type -> datanode.api.v2.ListNodeSignaturesResponse + 252, // 653: datanode.api.v2.TradingDataService.GetEpoch:output_type -> datanode.api.v2.GetEpochResponse + 254, // 654: datanode.api.v2.TradingDataService.EstimateFee:output_type -> datanode.api.v2.EstimateFeeResponse + 256, // 655: datanode.api.v2.TradingDataService.EstimateMargin:output_type -> datanode.api.v2.EstimateMarginResponse + 332, // 656: datanode.api.v2.TradingDataService.EstimatePosition:output_type -> datanode.api.v2.EstimatePositionResponse + 258, // 657: datanode.api.v2.TradingDataService.ListNetworkParameters:output_type -> datanode.api.v2.ListNetworkParametersResponse + 260, // 658: datanode.api.v2.TradingDataService.GetNetworkParameter:output_type -> datanode.api.v2.GetNetworkParameterResponse + 265, // 659: datanode.api.v2.TradingDataService.ListCheckpoints:output_type -> datanode.api.v2.ListCheckpointsResponse + 269, // 660: datanode.api.v2.TradingDataService.GetStake:output_type -> datanode.api.v2.GetStakeResponse + 273, // 661: datanode.api.v2.TradingDataService.GetRiskFactors:output_type -> datanode.api.v2.GetRiskFactorsResponse + 275, // 662: datanode.api.v2.TradingDataService.ObserveEventBus:output_type -> datanode.api.v2.ObserveEventBusResponse + 277, // 663: datanode.api.v2.TradingDataService.ObserveLedgerMovements:output_type -> datanode.api.v2.ObserveLedgerMovementsResponse + 279, // 664: datanode.api.v2.TradingDataService.ListKeyRotations:output_type -> datanode.api.v2.ListKeyRotationsResponse + 283, // 665: datanode.api.v2.TradingDataService.ListEthereumKeyRotations:output_type -> datanode.api.v2.ListEthereumKeyRotationsResponse + 287, // 666: datanode.api.v2.TradingDataService.GetVegaTime:output_type -> datanode.api.v2.GetVegaTimeResponse + 290, // 667: datanode.api.v2.TradingDataService.GetProtocolUpgradeStatus:output_type -> datanode.api.v2.GetProtocolUpgradeStatusResponse + 292, // 668: datanode.api.v2.TradingDataService.ListProtocolUpgradeProposals:output_type -> datanode.api.v2.ListProtocolUpgradeProposalsResponse + 296, // 669: datanode.api.v2.TradingDataService.ListCoreSnapshots:output_type -> datanode.api.v2.ListCoreSnapshotsResponse + 301, // 670: datanode.api.v2.TradingDataService.GetMostRecentNetworkHistorySegment:output_type -> datanode.api.v2.GetMostRecentNetworkHistorySegmentResponse + 303, // 671: datanode.api.v2.TradingDataService.ListAllNetworkHistorySegments:output_type -> datanode.api.v2.ListAllNetworkHistorySegmentsResponse + 305, // 672: datanode.api.v2.TradingDataService.GetActiveNetworkHistoryPeerAddresses:output_type -> datanode.api.v2.GetActiveNetworkHistoryPeerAddressesResponse + 307, // 673: datanode.api.v2.TradingDataService.GetNetworkHistoryStatus:output_type -> datanode.api.v2.GetNetworkHistoryStatusResponse + 309, // 674: datanode.api.v2.TradingDataService.GetNetworkHistoryBootstrapPeers:output_type -> datanode.api.v2.GetNetworkHistoryBootstrapPeersResponse + 312, // 675: datanode.api.v2.TradingDataService.ListEntities:output_type -> datanode.api.v2.ListEntitiesResponse + 323, // 676: datanode.api.v2.TradingDataService.ListFundingPeriods:output_type -> datanode.api.v2.ListFundingPeriodsResponse + 327, // 677: datanode.api.v2.TradingDataService.ListFundingPeriodDataPoints:output_type -> datanode.api.v2.ListFundingPeriodDataPointsResponse + 319, // 678: datanode.api.v2.TradingDataService.ListFundingPayments:output_type -> datanode.api.v2.ListFundingPaymentsResponse + 314, // 679: datanode.api.v2.TradingDataService.GetPartyActivityStreak:output_type -> datanode.api.v2.GetPartyActivityStreakResponse + 338, // 680: datanode.api.v2.TradingDataService.GetCurrentReferralProgram:output_type -> datanode.api.v2.GetCurrentReferralProgramResponse + 344, // 681: datanode.api.v2.TradingDataService.ListReferralSets:output_type -> datanode.api.v2.ListReferralSetsResponse + 349, // 682: datanode.api.v2.TradingDataService.ListReferralSetReferees:output_type -> datanode.api.v2.ListReferralSetRefereesResponse + 351, // 683: datanode.api.v2.TradingDataService.GetReferralSetStats:output_type -> datanode.api.v2.GetReferralSetStatsResponse + 359, // 684: datanode.api.v2.TradingDataService.ListTeams:output_type -> datanode.api.v2.ListTeamsResponse + 361, // 685: datanode.api.v2.TradingDataService.ListTeamsStatistics:output_type -> datanode.api.v2.ListTeamsStatisticsResponse + 368, // 686: datanode.api.v2.TradingDataService.ListTeamMembersStatistics:output_type -> datanode.api.v2.ListTeamMembersStatisticsResponse + 376, // 687: datanode.api.v2.TradingDataService.ListTeamReferees:output_type -> datanode.api.v2.ListTeamRefereesResponse + 381, // 688: datanode.api.v2.TradingDataService.ListTeamRefereeHistory:output_type -> datanode.api.v2.ListTeamRefereeHistoryResponse + 383, // 689: datanode.api.v2.TradingDataService.GetFeesStats:output_type -> datanode.api.v2.GetFeesStatsResponse + 385, // 690: datanode.api.v2.TradingDataService.GetFeesStatsForParty:output_type -> datanode.api.v2.GetFeesStatsForPartyResponse + 387, // 691: datanode.api.v2.TradingDataService.GetCurrentVolumeDiscountProgram:output_type -> datanode.api.v2.GetCurrentVolumeDiscountProgramResponse + 389, // 692: datanode.api.v2.TradingDataService.GetVolumeDiscountStats:output_type -> datanode.api.v2.GetVolumeDiscountStatsResponse + 11, // 693: datanode.api.v2.TradingDataService.GetVestingBalancesSummary:output_type -> datanode.api.v2.GetVestingBalancesSummaryResponse + 9, // 694: datanode.api.v2.TradingDataService.GetPartyVestingStats:output_type -> datanode.api.v2.GetPartyVestingStatsResponse + 396, // 695: datanode.api.v2.TradingDataService.ObserveTransactionResults:output_type -> datanode.api.v2.ObserveTransactionResultsResponse + 398, // 696: datanode.api.v2.TradingDataService.EstimateTransferFee:output_type -> datanode.api.v2.EstimateTransferFeeResponse + 400, // 697: datanode.api.v2.TradingDataService.GetTotalTransferFeeDiscount:output_type -> datanode.api.v2.GetTotalTransferFeeDiscountResponse + 402, // 698: datanode.api.v2.TradingDataService.ListGames:output_type -> datanode.api.v2.ListGamesResponse + 412, // 699: datanode.api.v2.TradingDataService.ListPartyMarginModes:output_type -> datanode.api.v2.ListPartyMarginModesResponse + 418, // 700: datanode.api.v2.TradingDataService.GetTimeWeightedNotionalPosition:output_type -> datanode.api.v2.GetTimeWeightedNotionalPositionResponse + 420, // 701: datanode.api.v2.TradingDataService.ListAMMPools:output_type -> datanode.api.v2.ListAMMPoolsResponse + 501, // 702: datanode.api.v2.TradingDataService.ExportNetworkHistory:output_type -> google.api.HttpBody + 329, // 703: datanode.api.v2.TradingDataService.Ping:output_type -> datanode.api.v2.PingResponse + 582, // [582:704] is the sub-list for method output_type + 460, // [460:582] is the sub-list for method input_type + 460, // [460:460] is the sub-list for extension type_name + 460, // [460:460] is the sub-list for extension extendee + 0, // [0:460] is the sub-list for field type_name } func init() { file_data_node_api_v2_trading_data_proto_init() } @@ -36727,6 +37046,54 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } + file_data_node_api_v2_trading_data_proto_msgTypes[413].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListAMMPoolsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_node_api_v2_trading_data_proto_msgTypes[414].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListAMMPoolsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_node_api_v2_trading_data_proto_msgTypes[415].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AMMPoolsConnection); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_data_node_api_v2_trading_data_proto_msgTypes[416].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AMMPoolEdge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_data_node_api_v2_trading_data_proto_msgTypes[0].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[4].OneofWrappers = []interface{}{} @@ -36832,13 +37199,14 @@ func file_data_node_api_v2_trading_data_proto_init() { file_data_node_api_v2_trading_data_proto_msgTypes[405].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[409].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[411].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[413].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_data_node_api_v2_trading_data_proto_rawDesc, NumEnums: 6, - NumMessages: 413, + NumMessages: 417, NumExtensions: 0, NumServices: 1, }, diff --git a/protos/data-node/api/v2/trading_data.pb.gw.go b/protos/data-node/api/v2/trading_data.pb.gw.go index f2aaf612911..d7989838ae0 100644 --- a/protos/data-node/api/v2/trading_data.pb.gw.go +++ b/protos/data-node/api/v2/trading_data.pb.gw.go @@ -4427,6 +4427,42 @@ func local_request_TradingDataService_GetTimeWeightedNotionalPosition_0(ctx cont } +var ( + filter_TradingDataService_ListAMMPools_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_TradingDataService_ListAMMPools_0(ctx context.Context, marshaler runtime.Marshaler, client TradingDataServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListAMMPoolsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TradingDataService_ListAMMPools_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListAMMPools(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_TradingDataService_ListAMMPools_0(ctx context.Context, marshaler runtime.Marshaler, server TradingDataServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListAMMPoolsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_TradingDataService_ListAMMPools_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListAMMPools(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_TradingDataService_ExportNetworkHistory_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -6804,6 +6840,29 @@ func RegisterTradingDataServiceHandlerServer(ctx context.Context, mux *runtime.S }) + mux.Handle("GET", pattern_TradingDataService_ListAMMPools_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/datanode.api.v2.TradingDataService/ListAMMPools", runtime.WithHTTPPathPattern("/api/v2/amm-pools")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TradingDataService_ListAMMPools_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_TradingDataService_ListAMMPools_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_TradingDataService_ExportNetworkHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -9112,6 +9171,26 @@ func RegisterTradingDataServiceHandlerClient(ctx context.Context, mux *runtime.S }) + mux.Handle("GET", pattern_TradingDataService_ListAMMPools_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/datanode.api.v2.TradingDataService/ListAMMPools", runtime.WithHTTPPathPattern("/api/v2/amm-pools")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TradingDataService_ListAMMPools_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_TradingDataService_ListAMMPools_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_TradingDataService_ExportNetworkHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -9362,6 +9441,8 @@ var ( pattern_TradingDataService_GetTimeWeightedNotionalPosition_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v2", "time-weighted-notional-position"}, "")) + pattern_TradingDataService_ListAMMPools_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v2", "amm-pools"}, "")) + pattern_TradingDataService_ExportNetworkHistory_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "networkhistory", "export"}, "")) ) @@ -9592,5 +9673,7 @@ var ( forward_TradingDataService_GetTimeWeightedNotionalPosition_0 = runtime.ForwardResponseMessage + forward_TradingDataService_ListAMMPools_0 = runtime.ForwardResponseMessage + forward_TradingDataService_ExportNetworkHistory_0 = runtime.ForwardResponseStream ) diff --git a/protos/data-node/api/v2/trading_data_grpc.pb.go b/protos/data-node/api/v2/trading_data_grpc.pb.go index 8bf070dbd57..65f1c5c1bb7 100644 --- a/protos/data-node/api/v2/trading_data_grpc.pb.go +++ b/protos/data-node/api/v2/trading_data_grpc.pb.go @@ -562,6 +562,10 @@ type TradingDataServiceClient interface { // If no epoch is specified, the final time weighted notional position from the end of the most recently completed epoch is returned. // If an epoch is specified, the final time weighted notional position at that epoch is returned. GetTimeWeightedNotionalPosition(ctx context.Context, in *GetTimeWeightedNotionalPositionRequest, opts ...grpc.CallOption) (*GetTimeWeightedNotionalPositionResponse, error) + // List AMM Pools + // + // Get a list of AMM pools or filter by market ID, party ID or pool ID + ListAMMPools(ctx context.Context, in *ListAMMPoolsRequest, opts ...grpc.CallOption) (*ListAMMPoolsResponse, error) // Export network history as CSV // // Export CSV table data from network history between two block heights. @@ -2079,6 +2083,15 @@ func (c *tradingDataServiceClient) GetTimeWeightedNotionalPosition(ctx context.C return out, nil } +func (c *tradingDataServiceClient) ListAMMPools(ctx context.Context, in *ListAMMPoolsRequest, opts ...grpc.CallOption) (*ListAMMPoolsResponse, error) { + out := new(ListAMMPoolsResponse) + err := c.cc.Invoke(ctx, "/datanode.api.v2.TradingDataService/ListAMMPools", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *tradingDataServiceClient) ExportNetworkHistory(ctx context.Context, in *ExportNetworkHistoryRequest, opts ...grpc.CallOption) (TradingDataService_ExportNetworkHistoryClient, error) { stream, err := c.cc.NewStream(ctx, &TradingDataService_ServiceDesc.Streams[16], "/datanode.api.v2.TradingDataService/ExportNetworkHistory", opts...) if err != nil { @@ -2663,6 +2676,10 @@ type TradingDataServiceServer interface { // If no epoch is specified, the final time weighted notional position from the end of the most recently completed epoch is returned. // If an epoch is specified, the final time weighted notional position at that epoch is returned. GetTimeWeightedNotionalPosition(context.Context, *GetTimeWeightedNotionalPositionRequest) (*GetTimeWeightedNotionalPositionResponse, error) + // List AMM Pools + // + // Get a list of AMM pools or filter by market ID, party ID or pool ID + ListAMMPools(context.Context, *ListAMMPoolsRequest) (*ListAMMPoolsResponse, error) // Export network history as CSV // // Export CSV table data from network history between two block heights. @@ -3093,6 +3110,9 @@ func (UnimplementedTradingDataServiceServer) ListPartyMarginModes(context.Contex func (UnimplementedTradingDataServiceServer) GetTimeWeightedNotionalPosition(context.Context, *GetTimeWeightedNotionalPositionRequest) (*GetTimeWeightedNotionalPositionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTimeWeightedNotionalPosition not implemented") } +func (UnimplementedTradingDataServiceServer) ListAMMPools(context.Context, *ListAMMPoolsRequest) (*ListAMMPoolsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListAMMPools not implemented") +} func (UnimplementedTradingDataServiceServer) ExportNetworkHistory(*ExportNetworkHistoryRequest, TradingDataService_ExportNetworkHistoryServer) error { return status.Errorf(codes.Unimplemented, "method ExportNetworkHistory not implemented") } @@ -5307,6 +5327,24 @@ func _TradingDataService_GetTimeWeightedNotionalPosition_Handler(srv interface{} return interceptor(ctx, in, info, handler) } +func _TradingDataService_ListAMMPools_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListAMMPoolsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TradingDataServiceServer).ListAMMPools(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/datanode.api.v2.TradingDataService/ListAMMPools", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TradingDataServiceServer).ListAMMPools(ctx, req.(*ListAMMPoolsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _TradingDataService_ExportNetworkHistory_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(ExportNetworkHistoryRequest) if err := stream.RecvMsg(m); err != nil { @@ -5765,6 +5803,10 @@ var TradingDataService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetTimeWeightedNotionalPosition", Handler: _TradingDataService_GetTimeWeightedNotionalPosition_Handler, }, + { + MethodName: "ListAMMPools", + Handler: _TradingDataService_ListAMMPools_Handler, + }, { MethodName: "Ping", Handler: _TradingDataService_Ping_Handler, diff --git a/protos/embed_test.go b/protos/embed_test.go index 5581a990eeb..2a0e567c88c 100644 --- a/protos/embed_test.go +++ b/protos/embed_test.go @@ -45,7 +45,7 @@ func Test_DataNodeBindings(t *testing.T) { t.Run("CoreBindings should return the core http bindings", func(t *testing.T) { bindings, err := protos.DataNodeBindings() require.NoError(t, err) - wantCount := 114 + wantCount := 115 assert.Len(t, bindings.HTTP.Rules, wantCount) diff --git a/protos/sources/data-node/api/v2/trading_data.proto b/protos/sources/data-node/api/v2/trading_data.proto index f4dee0ee4dd..e7a7d3aed9a 100644 --- a/protos/sources/data-node/api/v2/trading_data.proto +++ b/protos/sources/data-node/api/v2/trading_data.proto @@ -936,6 +936,13 @@ service TradingDataService { rpc GetTimeWeightedNotionalPosition(GetTimeWeightedNotionalPositionRequest) returns (GetTimeWeightedNotionalPositionResponse) { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "Positions"}; } + + // List AMM Pools + // + // Get a list of AMM pools or filter by market ID, party ID or pool ID + rpc ListAMMPools(ListAMMPoolsRequest) returns (ListAMMPoolsResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "AMMPool"}; + } // Export network history as CSV // @@ -4844,3 +4851,39 @@ message GetTimeWeightedNotionalPositionResponse { // Time weighted notional position for the party and asset. TimeWeightedNotionalPosition time_weighted_notional_position = 1; } + +message ListAMMPoolsRequest { + // Party ID to filter for. + optional string party_id = 1; + // Market ID to filter for. If party ID is provided, the market filter is ignored + optional string market_id = 2; + // Pool ID to filter for. If party ID or market ID is provided, the pool ID filter is ignored. + optional string pool_id = 3; + // Party's underlying AMM sub-account to filter for. A party's AMM sub-account will remain the + // same regardless of the AMM pool. + optional string sub_account = 4; + // Filter for AMM pools with the given status. This filter will be ignored if any of the other + // filters have been set. + optional vega.events.v1.AMMPool.Status status = 5; + // Pagination controls. + optional Pagination pagination = 6; +} + +message ListAMMPoolsResponse { + // Page of AMM pool data and corresponding page information. + AMMPoolsConnection amm_pools = 1; +} + +message AMMPoolsConnection { + // Page of AMM pool data and their corresponding cursors. + repeated AMMPoolEdge edges = 1; + // Page information that is used for fetching further pages. + PageInfo page_info = 2; +} + +message AMMPoolEdge { + // AMM pool data. + vega.events.v1.AMMPool node = 1; + // Cursor that can be used to fetch further pages. + string cursor = 2; +} diff --git a/protos/sources/data-node/grpc-rest-bindings.yml b/protos/sources/data-node/grpc-rest-bindings.yml index 60d5fec7d7b..b7a3429451b 100644 --- a/protos/sources/data-node/grpc-rest-bindings.yml +++ b/protos/sources/data-node/grpc-rest-bindings.yml @@ -209,6 +209,8 @@ http: get: "/api/v2/margin-modes" - selector: datanode.api.v2.TradingDataService.GetTimeWeightedNotionalPosition get: "/api/v2/time-weighted-notional-position" + - selector: datanode.api.v2.TradingDataService.ListAMMPools + get: "/api/v2/amm-pools" # websockets diff --git a/protos/sources/vega/checkpoint/v1/checkpoint.proto b/protos/sources/vega/checkpoint/v1/checkpoint.proto index 58c9ab12af3..5b751fef6b2 100644 --- a/protos/sources/vega/checkpoint/v1/checkpoint.proto +++ b/protos/sources/vega/checkpoint/v1/checkpoint.proto @@ -242,6 +242,8 @@ message MarketActivityTracker { repeated ReturnsData realised_returns = 21; repeated EpochReturnsData realised_returns_history = 22; + + repeated string amm_parties = 23; } message EpochPartyTakerFees { diff --git a/protos/sources/vega/commands/v1/commands.proto b/protos/sources/vega/commands/v1/commands.proto index 623bc72b7c9..2ddcbac9a6a 100644 --- a/protos/sources/vega/commands/v1/commands.proto +++ b/protos/sources/vega/commands/v1/commands.proto @@ -428,3 +428,72 @@ message UpdatePartyProfile { // Support a maximum of 10 entries. repeated vega.Metadata metadata = 2; } + +// Command to create an AMM pool for a given market. +message SubmitAMM { + // The market for which to create an AMM pool. + string market_id = 1; + // Amount to be committed to the pool. + string commitment_amount = 2; + // Slippage tolerance used for rebasing position when creating/updating AMM + string slippage_tolerance = 3; + // Concentrated liquidity parameters. + ConcentratedLiquidityParameters concentrated_liquidity_parameters = 4; + // Nominated liquidity fee factor, which is an input to the calculation of taker fees on the market. + string proposed_fee = 5; + // Liquidity parameters that define the size and range of the AMM's tradeable volume. + message ConcentratedLiquidityParameters { + // Upper price bound configuration for the pool. If unset, the AMM will never hold a short position. + optional string upper_bound = 1; + // Lower price bound configuration for the pool. If unset, the AMM will never hold a long position. + optional string lower_bound = 2; + // Base price bound configuration for the pool. + string base = 3; + // Margin ratio at upper bounds. Must be set if an upper bound is provided. + optional string margin_ratio_at_upper_bound = 4; + // Margin ratio at lower bounds. Must be set if a lower bound is provided. + optional string margin_ratio_at_lower_bound = 5; + } +} + +// Command to create an AMM pool for a given market. +message AmendAMM { + // Market ID for the AMM pool to be amended. + string market_id = 1; + // Amount to be committed to the pool. + optional string commitment_amount = 2; + // Slippage tolerance for rebasing position when creating or updating AMM + string slippage_tolerance = 3; + // Concentrated liquidity parameters. + optional ConcentratedLiquidityParameters concentrated_liquidity_parameters = 4; + // Nominated liquidity fee factor, which is an input to the calculation of taker fees on the market. + optional string proposed_fee = 5; + // Liquidity parameters that define the size and range of the AMM's tradeable volume. + message ConcentratedLiquidityParameters { + // Upper price bound configuration for the pool. + optional string upper_bound = 1; + // Lower price bound configuration for the pool. + optional string lower_bound = 2; + // Base price bound configuration for the pool. + optional string base = 3; + // Margin ratio at upper bound. + optional string margin_ratio_at_upper_bound = 4; + // Margin ratio at lower bound. + optional string margin_ratio_at_lower_bound = 5; + } +} + +// Command to create an AMM pool for a given market. +message CancelAMM { + enum Method { + METHOD_UNSPECIFIED = 0; + // Cancellation will be immediate and any open positions will be transferred to the network for liquidation. + METHOD_IMMEDIATE = 1; + // AMM will only trade to reduce its position, and will be cancelled once its position reaches zero. + METHOD_REDUCE_ONLY = 2; + } + // Market ID to cancel an AMM for. + string market_id = 1; + // Method to use to cancel the AMM. + Method method = 2; +} diff --git a/protos/sources/vega/commands/v1/transaction.proto b/protos/sources/vega/commands/v1/transaction.proto index 43373827555..14d902d3888 100644 --- a/protos/sources/vega/commands/v1/transaction.proto +++ b/protos/sources/vega/commands/v1/transaction.proto @@ -69,6 +69,13 @@ message InputData { BatchProposalSubmission batch_proposal_submission = 1023; // Command to update a party's profile. UpdatePartyProfile update_party_profile = 1024; + // Command to submit an AMM pool to a market + SubmitAMM submit_amm = 1025; + // Command to amend an AMM pool on a market + AmendAMM amend_amm = 1026; + // Command to cancel an AMM pool on a market + CancelAMM cancel_amm = 1027; + // Validator command sent automatically to vote on that validity of an external resource. NodeVote node_vote = 2002; // Validator command sent automatically to provide signatures for the Ethereum bridge. diff --git a/protos/sources/vega/events/v1/events.proto b/protos/sources/vega/events/v1/events.proto index fc9efbf3e9d..718ee238b68 100644 --- a/protos/sources/vega/events/v1/events.proto +++ b/protos/sources/vega/events/v1/events.proto @@ -31,6 +31,71 @@ message TimeWeightedNotionalPositionUpdated { string time_weighted_notional_position = 5; } +message AMMPool { + // Owner of the AMM. + string party_id = 1; + // Market ID that the AMM provides liquidity for. + string market_id = 2; + // ID of the AMM. + string pool_id = 3; + // Party ID that the AMM operates as. + string sub_account = 4; + // Amount committed to the AMM. + string commitment = 5; + // Liquidity parameters that define the size and range of the AMM's tradeable volume. + ConcentratedLiquidityParameters parameters = 6; + // Current status of the AMM. + Status status = 7; + // Reason for the AMM's current status. + StatusReason status_reason = 8; + + enum Status { + STATUS_UNSPECIFIED = 0; + // AMM is active on the market and can be traded against. + STATUS_ACTIVE = 1; + // AMM submission was rejected. + STATUS_REJECTED = 2; + // AMM has been cancelled by the owner and is no longer trading. + STATUS_CANCELLED = 3; + // AMM has been stopped by the network and is no longer trading. + STATUS_STOPPED = 4; + // AMM will only trade such that it will reduce its position. + STATUS_REDUCE_ONLY = 5; + } + + enum StatusReason { + STATUS_REASON_UNSPECIFIED = 0; + // AMM was cancelled by the owner of the AMM. + STATUS_REASON_CANCELLED_BY_PARTY = 1; + // Party does not have enough funds in their general account to meet the AMM's commitment. + STATUS_REASON_CANNOT_FILL_COMMITMENT = 2; + // Party already has an AMM operating on this market and cannot create another one. + STATUS_REASON_PARTY_ALREADY_OWNS_A_POOL = 3; + // AMM was liquidated and stopped by the network. + STATUS_REASON_PARTY_CLOSED_OUT = 4; + // AMM was stopped by the network because the market it operated in was closed. + STATUS_REASON_MARKET_CLOSED = 5; + // Party does not have enough funds in their general account to meet the AMM's commitment. + STATUS_REASON_COMMITMENT_TOO_LOW = 6; + // AMM was unable to rebase its fair-price such that it does no enter crossed. + STATUS_REASON_CANNOT_REBASE = 7; + } + + // Liquidity parameters that define the range and shape of the AMM's curve. + message ConcentratedLiquidityParameters { + // Base price bound configuration for the pool. + string base = 1; + // Upper price bound configuration for the pool. If unset, the AMM will never hold a short position. + string lower_bound = 2; + // Lower price bound configuration for the pool. If unset, the AMM will never hold a long position. + string upper_bound = 3; + // Margin ratio at upper bounds. + string margin_ratio_at_upper_bound = 4; + // Margin ratio at upper bounds. + string margin_ratio_at_lower_bound = 5; + } +} + // Summary of the vesting and locked balances for an epoch message VestingBalancesSummary { // Epoch for which these balances are valid. @@ -543,6 +608,9 @@ message TransactionResult { commands.v1.JoinTeam join_team = 128; commands.v1.BatchProposalSubmission batch_proposal = 129; commands.v1.UpdatePartyProfile update_party_profile = 130; + commands.v1.SubmitAMM submit_amm = 131; + commands.v1.AmendAMM amend_amm = 132; + commands.v1.CancelAMM cancel_amm = 133; } // extra details about the transaction processing @@ -1354,6 +1422,9 @@ enum BusEventType { // Event containing the IDs of orders cancelled by a party on a market. BUS_EVENT_TYPE_CANCELLED_ORDERS = 89; + + // Event use to notify for a amm pool update. + BUS_EVENT_TYPE_AMM_POOL = 90; // Event indicating a market related event, for example when a market opens BUS_EVENT_TYPE_MARKET = 101; @@ -1542,6 +1613,8 @@ message BusEvent { TimeWeightedNotionalPositionUpdated time_weighted_notional_position_updated = 186; // Event notifying of multiple orders being cancelled for a given party, on a given market. CancelledOrders cancelled_orders = 187; + // Event notifying of an amm pool update. + AMMPool amm_pool = 188; // Market tick events MarketEvent market = 1001; diff --git a/protos/sources/vega/snapshot/v1/snapshot.proto b/protos/sources/vega/snapshot/v1/snapshot.proto index 26186f26056..9eea27c87cd 100644 --- a/protos/sources/vega/snapshot/v1/snapshot.proto +++ b/protos/sources/vega/snapshot/v1/snapshot.proto @@ -551,6 +551,7 @@ message Market { optional CompositePriceCalculator internal_composite_price_calculator = 30; int64 next_internal_composite_price_calc = 31; MarketLiquidity market_liquidity = 32; + AmmState amm = 33; } message PartyMarginFactor { @@ -558,6 +559,42 @@ message PartyMarginFactor { string margin_factor = 2; } +message AmmState { + repeated StringMapEntry sqrter = 1; + repeated StringMapEntry sub_accounts = 2; + repeated PoolMapEntry pools = 3; +} + +message PoolMapEntry { + message Curve { + string l = 1; + string high = 2; + string low = 3; + string rf = 4; + bool empty = 5; + } + + message Pool { + string id = 1; + string sub_account = 2; + string commitment = 3; + vega.events.v1.AMMPool.ConcentratedLiquidityParameters parameters = 4; + string asset = 5; + string market = 6; + Curve lower = 7; + Curve upper = 8; + vega.events.v1.AMMPool.Status status = 9; + } + + string party = 1; + Pool pool = 2; +} + +message StringMapEntry { + string key = 1; + string value = 2; +} + // eventually support multiple products message Product { oneof type { @@ -761,6 +798,7 @@ message LimitState { int64 propose_asset_enabled_from = 8; bool propose_spot_market_enabled = 9; bool propose_perps_market_enabled = 10; + bool can_use_amm_enabled = 11; } message VoteSpamPolicy { @@ -1370,6 +1408,15 @@ message PartyProfile { repeated vega.Metadata metadata = 3; } +message AMMValues { + string party = 1; + string stake = 2; + string score = 3; + int64 tick = 4; +} + message MarketLiquidity { string price_range = 1; + int64 tick = 2; + repeated AMMValues amm = 3; } diff --git a/protos/sources/vega/vega.proto b/protos/sources/vega/vega.proto index 7b0f51a4708..1c79307a79c 100644 --- a/protos/sources/vega/vega.proto +++ b/protos/sources/vega/vega.proto @@ -1046,6 +1046,12 @@ enum TransferType { TRANSFER_TYPE_ISOLATED_MARGIN_LOW = 47; // Transfer from excess order margin account to general account. TRANSFER_TYPE_ISOLATED_MARGIN_HIGH = 48; + // Transfer from a party's general account to their AMM's sub-account. + TRANSFER_TYPE_AMM_SUBACCOUNT_LOW = 49; + // Transfer from an AMM's sub-account to their owner's general account. + TRANSFER_TYPE_AMM_SUBACCOUNT_HIGH = 50; + // Transfer releasing an AMM's general account upon closure. + TRANSFER_TYPE_AMM_SUBACCOUNT_RELEASE = 51; } // Represents a financial transfer within Vega @@ -1100,6 +1106,8 @@ enum IndividualScope { INDIVIDUAL_SCOPE_IN_TEAM = 2; // All parties that are not part of a team are within the scope of this reward. INDIVIDUAL_SCOPE_NOT_IN_TEAM = 3; + // All keys representing AMMs are within the scope of this reward. + INDIVIDUAL_SCOPE_AMM = 4; } enum DistributionStrategy { @@ -1457,6 +1465,8 @@ message NetworkLimits { bool can_propose_spot_market = 10; // Are perpetual market proposals allowed at this point in time. bool can_propose_perpetual_market = 11; + // Can parties use AMM related transactions. + bool can_use_amm = 12; } // Represents a liquidity order diff --git a/protos/sources/vega/wallet/v1/wallet.proto b/protos/sources/vega/wallet/v1/wallet.proto index 4f9aac4e2e2..91434378bba 100644 --- a/protos/sources/vega/wallet/v1/wallet.proto +++ b/protos/sources/vega/wallet/v1/wallet.proto @@ -40,6 +40,9 @@ message SubmitTransactionRequest { commands.v1.JoinTeam join_team = 1022; commands.v1.BatchProposalSubmission batch_proposal_submission = 1023; commands.v1.UpdatePartyProfile update_party_profile = 1024; + commands.v1.SubmitAMM submit_amm = 1025; + commands.v1.AmendAMM amend_amm = 1026; + commands.v1.CancelAMM cancel_amm = 1027; // Validator commands commands.v1.NodeVote node_vote = 2002; diff --git a/protos/vega/checkpoint/v1/checkpoint.pb.go b/protos/vega/checkpoint/v1/checkpoint.pb.go index bbc882dde38..17322da19c3 100644 --- a/protos/vega/checkpoint/v1/checkpoint.pb.go +++ b/protos/vega/checkpoint/v1/checkpoint.pb.go @@ -1997,6 +1997,7 @@ type MarketActivityTracker struct { LpPaidFees []*PartyFees `protobuf:"bytes,20,rep,name=lp_paid_fees,json=lpPaidFees,proto3" json:"lp_paid_fees,omitempty"` RealisedReturns []*ReturnsData `protobuf:"bytes,21,rep,name=realised_returns,json=realisedReturns,proto3" json:"realised_returns,omitempty"` RealisedReturnsHistory []*EpochReturnsData `protobuf:"bytes,22,rep,name=realised_returns_history,json=realisedReturnsHistory,proto3" json:"realised_returns_history,omitempty"` + AmmParties []string `protobuf:"bytes,23,rep,name=amm_parties,json=ammParties,proto3" json:"amm_parties,omitempty"` } func (x *MarketActivityTracker) Reset() { @@ -2185,6 +2186,13 @@ func (x *MarketActivityTracker) GetRealisedReturnsHistory() []*EpochReturnsData return nil } +func (x *MarketActivityTracker) GetAmmParties() []string { + if x != nil { + return x.AmmParties + } + return nil +} + type EpochPartyTakerFees struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3793,7 +3801,7 @@ var file_vega_checkpoint_v1_checkpoint_proto_rawDesc = []byte{ 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x52, 0x0e, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x22, 0x9e, 0x0c, + 0x70, 0x6f, 0x63, 0x68, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x22, 0xbf, 0x0c, 0x0a, 0x15, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, @@ -3891,180 +3899,182 @@ var file_vega_checkpoint_v1_checkpoint_proto_rawDesc = []byte{ 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x16, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, - 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x82, - 0x01, 0x0a, 0x13, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, - 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x12, 0x6b, 0x0a, 0x1b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, - 0x5f, 0x70, 0x61, 0x69, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x65, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1f, + 0x0a, 0x0b, 0x61, 0x6d, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x17, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6d, 0x6d, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x82, 0x01, 0x0a, 0x13, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, + 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x12, 0x6b, 0x0a, 0x1b, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, + 0x73, 0x5f, 0x70, 0x61, 0x69, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x50, 0x61, 0x72, + 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x52, 0x17, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, + 0x50, 0x61, 0x69, 0x64, 0x22, 0x8f, 0x01, 0x0a, 0x1b, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x69, + 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x70, 0x0a, 0x1d, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, - 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x52, 0x17, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x50, - 0x61, 0x69, 0x64, 0x22, 0x8f, 0x01, 0x0a, 0x1b, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x69, 0x6d, - 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x70, 0x0a, 0x1d, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, - 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1a, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x1d, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x54, - 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x70, 0x0a, 0x1d, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x6e, - 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x52, 0x1a, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, - 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x73, 0x22, 0x52, 0x0a, 0x19, 0x50, 0x61, 0x72, - 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, - 0x74, 0x77, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0a, 0x74, 0x77, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0x52, 0x0a, - 0x19, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x77, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x74, 0x77, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x8c, 0x01, 0x0a, 0x19, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x41, 0x0a, - 0x0a, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, - 0x72, 0x46, 0x65, 0x65, 0x73, 0x52, 0x09, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, - 0x22, 0x45, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, - 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x6b, 0x65, - 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x74, 0x61, - 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x22, 0x55, 0x0a, 0x0e, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x61, 0x72, - 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x22, 0x43, - 0x0a, 0x13, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x6f, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x12, 0x5b, 0x0a, 0x15, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x13, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x4e, - 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x4d, 0x0a, - 0x10, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x39, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x07, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x22, 0x3b, 0x0a, 0x0b, - 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x77, 0x0a, 0x0e, 0x54, 0x57, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1a, 0x70, 0x61, 0x72, 0x74, + 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x1d, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x70, 0x0a, 0x1d, 0x70, 0x61, 0x72, 0x74, + 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, + 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x52, 0x1a, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, + 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x73, 0x22, 0x52, 0x0a, 0x19, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, + 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1f, 0x0a, + 0x0b, 0x74, 0x77, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0a, 0x74, 0x77, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0x52, + 0x0a, 0x19, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x77, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x74, 0x77, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x77, 0x0a, 0x0e, 0x54, 0x57, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6e, 0x6f, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x77, - 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0a, 0x74, 0x77, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0x33, 0x0a, 0x09, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66, 0x65, 0x65, - 0x22, 0x3a, 0x0a, 0x10, 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x65, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x66, 0x65, 0x65, 0x22, 0xa8, 0x04, 0x0a, - 0x0b, 0x41, 0x73, 0x73, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x74, - 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x74, - 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x42, 0x0a, 0x0f, 0x62, 0x75, - 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x74, - 0x69, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x0e, - 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x37, - 0x0a, 0x0d, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, - 0x32, 0x30, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x0c, 0x65, 0x72, 0x63, 0x32, 0x30, - 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x33, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x1a, - 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, - 0x17, 0x65, 0x72, 0x63, 0x32, 0x30, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x65, 0x72, 0x63, 0x32, - 0x30, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x72, 0x63, 0x32, 0x30, 0x42, 0x72, 0x69, - 0x64, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x65, 0x72, - 0x63, 0x32, 0x30, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6d, - 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x72, 0x63, 0x32, 0x30, 0x42, - 0x72, 0x69, 0x64, 0x67, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x45, 0x4c, 0x53, 0x53, - 0x68, 0x61, 0x72, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, - 0x64, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, - 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x6b, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x61, 0x76, 0x67, 0x22, 0xa9, 0x02, 0x0a, 0x0b, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x4c, 0x53, 0x53, 0x68, 0x61, 0x72, - 0x65, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x73, - 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, - 0x72, 0x61, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x61, 0x73, - 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x24, 0x0a, 0x06, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x22, - 0x45, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x33, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x42, 0x35, 0x5a, 0x33, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, - 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x77, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x74, 0x77, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x8c, 0x01, 0x0a, 0x19, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x41, + 0x0a, 0x0a, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, + 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x52, 0x09, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, + 0x73, 0x22, 0x45, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, + 0x65, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x6b, + 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x74, + 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x22, 0x55, 0x0a, 0x0e, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x22, + 0x43, 0x0a, 0x13, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, + 0x6f, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x12, 0x5b, 0x0a, 0x15, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x13, 0x74, 0x61, 0x6b, 0x65, 0x72, + 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x4d, + 0x0a, 0x10, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x39, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, + 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x22, 0x3b, 0x0a, + 0x0b, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x77, 0x0a, 0x0e, 0x54, 0x57, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, + 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x77, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x74, 0x77, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x77, 0x0a, 0x0e, 0x54, 0x57, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6e, + 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6e, + 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, + 0x77, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0a, 0x74, 0x77, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0x33, 0x0a, 0x09, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66, 0x65, + 0x65, 0x22, 0x3a, 0x0a, 0x10, 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x66, + 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x66, 0x65, 0x65, 0x22, 0xa8, 0x04, + 0x0a, 0x0b, 0x41, 0x73, 0x73, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, + 0x74, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, + 0x74, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x42, 0x0a, 0x0f, 0x62, + 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x42, 0x75, 0x69, 0x6c, + 0x74, 0x69, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, + 0x0e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, + 0x37, 0x0a, 0x0d, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, + 0x43, 0x32, 0x30, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x0c, 0x65, 0x72, 0x63, 0x32, + 0x30, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x33, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x5a, 0x0a, + 0x1a, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x52, 0x17, 0x65, 0x72, 0x63, 0x32, 0x30, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x65, 0x72, 0x63, + 0x32, 0x30, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, + 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x72, 0x63, 0x32, 0x30, 0x42, 0x72, + 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x65, + 0x72, 0x63, 0x32, 0x30, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, + 0x6d, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x72, 0x63, 0x32, 0x30, + 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x12, 0x19, 0x0a, + 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x45, 0x4c, 0x53, + 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, + 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x74, 0x61, + 0x6b, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x61, 0x76, 0x67, 0x22, 0xa9, 0x02, 0x0a, 0x0b, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x4c, 0x53, 0x53, 0x68, 0x61, + 0x72, 0x65, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, + 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x74, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x5f, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x61, + 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x2b, 0x0a, + 0x11, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x24, 0x0a, 0x06, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x22, 0x45, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x42, 0x35, 0x5a, 0x33, 0x63, 0x6f, 0x64, 0x65, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, + 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, + 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2f, 0x76, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/protos/vega/commands/v1/commands.pb.go b/protos/vega/commands/v1/commands.pb.go index 70e8011c901..4bf73378a12 100644 --- a/protos/vega/commands/v1/commands.pb.go +++ b/protos/vega/commands/v1/commands.pb.go @@ -124,6 +124,57 @@ func (UndelegateSubmission_Method) EnumDescriptor() ([]byte, []int) { return file_vega_commands_v1_commands_proto_rawDescGZIP(), []int{18, 0} } +type CancelAMM_Method int32 + +const ( + CancelAMM_METHOD_UNSPECIFIED CancelAMM_Method = 0 + // Cancellation will be immediate and any open positions will be transferred to the network for liquidation. + CancelAMM_METHOD_IMMEDIATE CancelAMM_Method = 1 + // AMM will only trade to reduce its position, and will be cancelled once its position reaches zero. + CancelAMM_METHOD_REDUCE_ONLY CancelAMM_Method = 2 +) + +// Enum value maps for CancelAMM_Method. +var ( + CancelAMM_Method_name = map[int32]string{ + 0: "METHOD_UNSPECIFIED", + 1: "METHOD_IMMEDIATE", + 2: "METHOD_REDUCE_ONLY", + } + CancelAMM_Method_value = map[string]int32{ + "METHOD_UNSPECIFIED": 0, + "METHOD_IMMEDIATE": 1, + "METHOD_REDUCE_ONLY": 2, + } +) + +func (x CancelAMM_Method) Enum() *CancelAMM_Method { + p := new(CancelAMM_Method) + *p = x + return p +} + +func (x CancelAMM_Method) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (CancelAMM_Method) Descriptor() protoreflect.EnumDescriptor { + return file_vega_commands_v1_commands_proto_enumTypes[2].Descriptor() +} + +func (CancelAMM_Method) Type() protoreflect.EnumType { + return &file_vega_commands_v1_commands_proto_enumTypes[2] +} + +func (x CancelAMM_Method) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use CancelAMM_Method.Descriptor instead. +func (CancelAMM_Method) EnumDescriptor() ([]byte, []int) { + return file_vega_commands_v1_commands_proto_rawDescGZIP(), []int{31, 0} +} + // A command that allows the submission of a batch market instruction which wraps up multiple market instructions into a single transaction. // These instructions are then processed sequentially in the following order: // - OrderCancellation @@ -2281,6 +2332,234 @@ func (x *UpdatePartyProfile) GetMetadata() []*vega.Metadata { return nil } +// Command to create an AMM pool for a given market. +type SubmitAMM struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The market for which to create an AMM pool. + MarketId string `protobuf:"bytes,1,opt,name=market_id,json=marketId,proto3" json:"market_id,omitempty"` + // Amount to be committed to the pool. + CommitmentAmount string `protobuf:"bytes,2,opt,name=commitment_amount,json=commitmentAmount,proto3" json:"commitment_amount,omitempty"` + // Slippage tolerance used for rebasing position when creating/updating AMM + SlippageTolerance string `protobuf:"bytes,3,opt,name=slippage_tolerance,json=slippageTolerance,proto3" json:"slippage_tolerance,omitempty"` + // Concentrated liquidity parameters. + ConcentratedLiquidityParameters *SubmitAMM_ConcentratedLiquidityParameters `protobuf:"bytes,4,opt,name=concentrated_liquidity_parameters,json=concentratedLiquidityParameters,proto3" json:"concentrated_liquidity_parameters,omitempty"` + // Nominated liquidity fee factor, which is an input to the calculation of taker fees on the market. + ProposedFee string `protobuf:"bytes,5,opt,name=proposed_fee,json=proposedFee,proto3" json:"proposed_fee,omitempty"` +} + +func (x *SubmitAMM) Reset() { + *x = SubmitAMM{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_commands_v1_commands_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubmitAMM) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubmitAMM) ProtoMessage() {} + +func (x *SubmitAMM) ProtoReflect() protoreflect.Message { + mi := &file_vega_commands_v1_commands_proto_msgTypes[29] + 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 SubmitAMM.ProtoReflect.Descriptor instead. +func (*SubmitAMM) Descriptor() ([]byte, []int) { + return file_vega_commands_v1_commands_proto_rawDescGZIP(), []int{29} +} + +func (x *SubmitAMM) GetMarketId() string { + if x != nil { + return x.MarketId + } + return "" +} + +func (x *SubmitAMM) GetCommitmentAmount() string { + if x != nil { + return x.CommitmentAmount + } + return "" +} + +func (x *SubmitAMM) GetSlippageTolerance() string { + if x != nil { + return x.SlippageTolerance + } + return "" +} + +func (x *SubmitAMM) GetConcentratedLiquidityParameters() *SubmitAMM_ConcentratedLiquidityParameters { + if x != nil { + return x.ConcentratedLiquidityParameters + } + return nil +} + +func (x *SubmitAMM) GetProposedFee() string { + if x != nil { + return x.ProposedFee + } + return "" +} + +// Command to create an AMM pool for a given market. +type AmendAMM struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Market ID for the AMM pool to be amended. + MarketId string `protobuf:"bytes,1,opt,name=market_id,json=marketId,proto3" json:"market_id,omitempty"` + // Amount to be committed to the pool. + CommitmentAmount *string `protobuf:"bytes,2,opt,name=commitment_amount,json=commitmentAmount,proto3,oneof" json:"commitment_amount,omitempty"` + // Slippage tolerance for rebasing position when creating or updating AMM + SlippageTolerance string `protobuf:"bytes,3,opt,name=slippage_tolerance,json=slippageTolerance,proto3" json:"slippage_tolerance,omitempty"` + // Concentrated liquidity parameters. + ConcentratedLiquidityParameters *AmendAMM_ConcentratedLiquidityParameters `protobuf:"bytes,4,opt,name=concentrated_liquidity_parameters,json=concentratedLiquidityParameters,proto3,oneof" json:"concentrated_liquidity_parameters,omitempty"` + // Nominated liquidity fee factor, which is an input to the calculation of taker fees on the market. + ProposedFee *string `protobuf:"bytes,5,opt,name=proposed_fee,json=proposedFee,proto3,oneof" json:"proposed_fee,omitempty"` +} + +func (x *AmendAMM) Reset() { + *x = AmendAMM{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_commands_v1_commands_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AmendAMM) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AmendAMM) ProtoMessage() {} + +func (x *AmendAMM) ProtoReflect() protoreflect.Message { + mi := &file_vega_commands_v1_commands_proto_msgTypes[30] + 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 AmendAMM.ProtoReflect.Descriptor instead. +func (*AmendAMM) Descriptor() ([]byte, []int) { + return file_vega_commands_v1_commands_proto_rawDescGZIP(), []int{30} +} + +func (x *AmendAMM) GetMarketId() string { + if x != nil { + return x.MarketId + } + return "" +} + +func (x *AmendAMM) GetCommitmentAmount() string { + if x != nil && x.CommitmentAmount != nil { + return *x.CommitmentAmount + } + return "" +} + +func (x *AmendAMM) GetSlippageTolerance() string { + if x != nil { + return x.SlippageTolerance + } + return "" +} + +func (x *AmendAMM) GetConcentratedLiquidityParameters() *AmendAMM_ConcentratedLiquidityParameters { + if x != nil { + return x.ConcentratedLiquidityParameters + } + return nil +} + +func (x *AmendAMM) GetProposedFee() string { + if x != nil && x.ProposedFee != nil { + return *x.ProposedFee + } + return "" +} + +// Command to create an AMM pool for a given market. +type CancelAMM struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Market ID to cancel an AMM for. + MarketId string `protobuf:"bytes,1,opt,name=market_id,json=marketId,proto3" json:"market_id,omitempty"` + // Method to use to cancel the AMM. + Method CancelAMM_Method `protobuf:"varint,2,opt,name=method,proto3,enum=vega.commands.v1.CancelAMM_Method" json:"method,omitempty"` +} + +func (x *CancelAMM) Reset() { + *x = CancelAMM{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_commands_v1_commands_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CancelAMM) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CancelAMM) ProtoMessage() {} + +func (x *CancelAMM) ProtoReflect() protoreflect.Message { + mi := &file_vega_commands_v1_commands_proto_msgTypes[31] + 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 CancelAMM.ProtoReflect.Descriptor instead. +func (*CancelAMM) Descriptor() ([]byte, []int) { + return file_vega_commands_v1_commands_proto_rawDescGZIP(), []int{31} +} + +func (x *CancelAMM) GetMarketId() string { + if x != nil { + return x.MarketId + } + return "" +} + +func (x *CancelAMM) GetMethod() CancelAMM_Method { + if x != nil { + return x.Method + } + return CancelAMM_METHOD_UNSPECIFIED +} + type CreateReferralSet_Team struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2303,7 +2582,7 @@ type CreateReferralSet_Team struct { func (x *CreateReferralSet_Team) Reset() { *x = CreateReferralSet_Team{} if protoimpl.UnsafeEnabled { - mi := &file_vega_commands_v1_commands_proto_msgTypes[29] + mi := &file_vega_commands_v1_commands_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2316,7 +2595,7 @@ func (x *CreateReferralSet_Team) String() string { func (*CreateReferralSet_Team) ProtoMessage() {} func (x *CreateReferralSet_Team) ProtoReflect() protoreflect.Message { - mi := &file_vega_commands_v1_commands_proto_msgTypes[29] + mi := &file_vega_commands_v1_commands_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2390,7 +2669,7 @@ type UpdateReferralSet_Team struct { func (x *UpdateReferralSet_Team) Reset() { *x = UpdateReferralSet_Team{} if protoimpl.UnsafeEnabled { - mi := &file_vega_commands_v1_commands_proto_msgTypes[30] + mi := &file_vega_commands_v1_commands_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2403,7 +2682,7 @@ func (x *UpdateReferralSet_Team) String() string { func (*UpdateReferralSet_Team) ProtoMessage() {} func (x *UpdateReferralSet_Team) ProtoReflect() protoreflect.Message { - mi := &file_vega_commands_v1_commands_proto_msgTypes[30] + mi := &file_vega_commands_v1_commands_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2454,6 +2733,176 @@ func (x *UpdateReferralSet_Team) GetAllowList() []string { return nil } +// Liquidity parameters that define the size and range of the AMM's tradeable volume. +type SubmitAMM_ConcentratedLiquidityParameters struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Upper price bound configuration for the pool. If unset, the AMM will never hold a short position. + UpperBound *string `protobuf:"bytes,1,opt,name=upper_bound,json=upperBound,proto3,oneof" json:"upper_bound,omitempty"` + // Lower price bound configuration for the pool. If unset, the AMM will never hold a long position. + LowerBound *string `protobuf:"bytes,2,opt,name=lower_bound,json=lowerBound,proto3,oneof" json:"lower_bound,omitempty"` + // Base price bound configuration for the pool. + Base string `protobuf:"bytes,3,opt,name=base,proto3" json:"base,omitempty"` + // Margin ratio at upper bounds. Must be set if an upper bound is provided. + MarginRatioAtUpperBound *string `protobuf:"bytes,4,opt,name=margin_ratio_at_upper_bound,json=marginRatioAtUpperBound,proto3,oneof" json:"margin_ratio_at_upper_bound,omitempty"` + // Margin ratio at lower bounds. Must be set if a lower bound is provided. + MarginRatioAtLowerBound *string `protobuf:"bytes,5,opt,name=margin_ratio_at_lower_bound,json=marginRatioAtLowerBound,proto3,oneof" json:"margin_ratio_at_lower_bound,omitempty"` +} + +func (x *SubmitAMM_ConcentratedLiquidityParameters) Reset() { + *x = SubmitAMM_ConcentratedLiquidityParameters{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_commands_v1_commands_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubmitAMM_ConcentratedLiquidityParameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubmitAMM_ConcentratedLiquidityParameters) ProtoMessage() {} + +func (x *SubmitAMM_ConcentratedLiquidityParameters) ProtoReflect() protoreflect.Message { + mi := &file_vega_commands_v1_commands_proto_msgTypes[34] + 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 SubmitAMM_ConcentratedLiquidityParameters.ProtoReflect.Descriptor instead. +func (*SubmitAMM_ConcentratedLiquidityParameters) Descriptor() ([]byte, []int) { + return file_vega_commands_v1_commands_proto_rawDescGZIP(), []int{29, 0} +} + +func (x *SubmitAMM_ConcentratedLiquidityParameters) GetUpperBound() string { + if x != nil && x.UpperBound != nil { + return *x.UpperBound + } + return "" +} + +func (x *SubmitAMM_ConcentratedLiquidityParameters) GetLowerBound() string { + if x != nil && x.LowerBound != nil { + return *x.LowerBound + } + return "" +} + +func (x *SubmitAMM_ConcentratedLiquidityParameters) GetBase() string { + if x != nil { + return x.Base + } + return "" +} + +func (x *SubmitAMM_ConcentratedLiquidityParameters) GetMarginRatioAtUpperBound() string { + if x != nil && x.MarginRatioAtUpperBound != nil { + return *x.MarginRatioAtUpperBound + } + return "" +} + +func (x *SubmitAMM_ConcentratedLiquidityParameters) GetMarginRatioAtLowerBound() string { + if x != nil && x.MarginRatioAtLowerBound != nil { + return *x.MarginRatioAtLowerBound + } + return "" +} + +// Liquidity parameters that define the size and range of the AMM's tradeable volume. +type AmendAMM_ConcentratedLiquidityParameters struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Upper price bound configuration for the pool. + UpperBound *string `protobuf:"bytes,1,opt,name=upper_bound,json=upperBound,proto3,oneof" json:"upper_bound,omitempty"` + // Lower price bound configuration for the pool. + LowerBound *string `protobuf:"bytes,2,opt,name=lower_bound,json=lowerBound,proto3,oneof" json:"lower_bound,omitempty"` + // Base price bound configuration for the pool. + Base *string `protobuf:"bytes,3,opt,name=base,proto3,oneof" json:"base,omitempty"` + // Margin ratio at upper bound. + MarginRatioAtUpperBound *string `protobuf:"bytes,4,opt,name=margin_ratio_at_upper_bound,json=marginRatioAtUpperBound,proto3,oneof" json:"margin_ratio_at_upper_bound,omitempty"` + // Margin ratio at lower bound. + MarginRatioAtLowerBound *string `protobuf:"bytes,5,opt,name=margin_ratio_at_lower_bound,json=marginRatioAtLowerBound,proto3,oneof" json:"margin_ratio_at_lower_bound,omitempty"` +} + +func (x *AmendAMM_ConcentratedLiquidityParameters) Reset() { + *x = AmendAMM_ConcentratedLiquidityParameters{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_commands_v1_commands_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AmendAMM_ConcentratedLiquidityParameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AmendAMM_ConcentratedLiquidityParameters) ProtoMessage() {} + +func (x *AmendAMM_ConcentratedLiquidityParameters) ProtoReflect() protoreflect.Message { + mi := &file_vega_commands_v1_commands_proto_msgTypes[35] + 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 AmendAMM_ConcentratedLiquidityParameters.ProtoReflect.Descriptor instead. +func (*AmendAMM_ConcentratedLiquidityParameters) Descriptor() ([]byte, []int) { + return file_vega_commands_v1_commands_proto_rawDescGZIP(), []int{30, 0} +} + +func (x *AmendAMM_ConcentratedLiquidityParameters) GetUpperBound() string { + if x != nil && x.UpperBound != nil { + return *x.UpperBound + } + return "" +} + +func (x *AmendAMM_ConcentratedLiquidityParameters) GetLowerBound() string { + if x != nil && x.LowerBound != nil { + return *x.LowerBound + } + return "" +} + +func (x *AmendAMM_ConcentratedLiquidityParameters) GetBase() string { + if x != nil && x.Base != nil { + return *x.Base + } + return "" +} + +func (x *AmendAMM_ConcentratedLiquidityParameters) GetMarginRatioAtUpperBound() string { + if x != nil && x.MarginRatioAtUpperBound != nil { + return *x.MarginRatioAtUpperBound + } + return "" +} + +func (x *AmendAMM_ConcentratedLiquidityParameters) GetMarginRatioAtLowerBound() string { + if x != nil && x.MarginRatioAtLowerBound != nil { + return *x.MarginRatioAtLowerBound + } + return "" +} + var File_vega_commands_v1_commands_proto protoreflect.FileDescriptor var file_vega_commands_v1_commands_proto_rawDesc = []byte{ @@ -2823,11 +3272,112 @@ var file_vega_commands_v1_commands_proto_rawDesc = []byte{ 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x42, 0x33, 0x5a, 0x31, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, - 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x9b, 0x05, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x41, + 0x4d, 0x4d, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, + 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x12, + 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, + 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x87, 0x01, 0x0a, 0x21, + 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, + 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, + 0x74, 0x41, 0x4d, 0x4d, 0x2e, 0x43, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x52, 0x1f, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, + 0x64, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x65, 0x64, 0x46, 0x65, 0x65, 0x1a, 0xe7, 0x02, 0x0a, 0x1f, 0x43, 0x6f, 0x6e, + 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, 0x65, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x24, 0x0a, 0x0b, + 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x0a, 0x75, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0a, 0x6c, 0x6f, 0x77, 0x65, 0x72, + 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x1b, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x61, 0x74, 0x5f, + 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x02, 0x52, 0x17, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6f, + 0x41, 0x74, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x41, 0x0a, 0x1b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, + 0x61, 0x74, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x17, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, 0x61, + 0x74, 0x69, 0x6f, 0x41, 0x74, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, + 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x5f, 0x61, 0x74, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x22, 0x83, 0x06, 0x0a, 0x08, 0x41, 0x6d, 0x65, 0x6e, 0x64, 0x41, 0x4d, 0x4d, 0x12, + 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x11, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2d, + 0x0a, 0x12, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, + 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x6c, 0x69, 0x70, + 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x8b, 0x01, + 0x0a, 0x21, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6d, 0x65, + 0x6e, 0x64, 0x41, 0x4d, 0x4d, 0x2e, 0x43, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x48, 0x01, 0x52, 0x1f, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x02, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x46, 0x65, 0x65, + 0x88, 0x01, 0x01, 0x1a, 0xf5, 0x02, 0x0a, 0x1f, 0x43, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x24, 0x0a, 0x0b, 0x75, 0x70, 0x70, 0x65, 0x72, + 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, + 0x75, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, + 0x0b, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x0a, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, + 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x02, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1b, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x61, 0x74, 0x5f, + 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x03, 0x52, 0x17, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6f, + 0x41, 0x74, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x41, 0x0a, 0x1b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, + 0x61, 0x74, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x17, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, 0x61, + 0x74, 0x69, 0x6f, 0x41, 0x74, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, + 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x61, 0x74, 0x5f, + 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x61, 0x74, 0x5f, + 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x42, 0x24, 0x0a, 0x22, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x70, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x66, 0x65, 0x65, 0x22, 0xb4, 0x01, 0x0a, 0x09, 0x43, 0x61, 0x6e, + 0x63, 0x65, 0x6c, 0x41, 0x4d, 0x4d, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x41, 0x4d, 0x4d, + 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, + 0x4e, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x16, 0x0a, 0x12, 0x4d, 0x45, 0x54, + 0x48, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x49, 0x4d, 0x4d, 0x45, + 0x44, 0x49, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4d, 0x45, 0x54, 0x48, 0x4f, + 0x44, 0x5f, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x42, + 0x33, 0x5a, 0x31, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2842,103 +3392,112 @@ func file_vega_commands_v1_commands_proto_rawDescGZIP() []byte { return file_vega_commands_v1_commands_proto_rawDescData } -var file_vega_commands_v1_commands_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_vega_commands_v1_commands_proto_msgTypes = make([]protoimpl.MessageInfo, 31) +var file_vega_commands_v1_commands_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_vega_commands_v1_commands_proto_msgTypes = make([]protoimpl.MessageInfo, 36) var file_vega_commands_v1_commands_proto_goTypes = []interface{}{ - (UpdateMarginMode_Mode)(0), // 0: vega.commands.v1.UpdateMarginMode.Mode - (UndelegateSubmission_Method)(0), // 1: vega.commands.v1.UndelegateSubmission.Method - (*BatchMarketInstructions)(nil), // 2: vega.commands.v1.BatchMarketInstructions - (*StopOrdersSubmission)(nil), // 3: vega.commands.v1.StopOrdersSubmission - (*StopOrderSetup)(nil), // 4: vega.commands.v1.StopOrderSetup - (*StopOrdersCancellation)(nil), // 5: vega.commands.v1.StopOrdersCancellation - (*OrderSubmission)(nil), // 6: vega.commands.v1.OrderSubmission - (*IcebergOpts)(nil), // 7: vega.commands.v1.IcebergOpts - (*UpdateMarginMode)(nil), // 8: vega.commands.v1.UpdateMarginMode - (*OrderCancellation)(nil), // 9: vega.commands.v1.OrderCancellation - (*OrderAmendment)(nil), // 10: vega.commands.v1.OrderAmendment - (*LiquidityProvisionSubmission)(nil), // 11: vega.commands.v1.LiquidityProvisionSubmission - (*LiquidityProvisionCancellation)(nil), // 12: vega.commands.v1.LiquidityProvisionCancellation - (*LiquidityProvisionAmendment)(nil), // 13: vega.commands.v1.LiquidityProvisionAmendment - (*WithdrawSubmission)(nil), // 14: vega.commands.v1.WithdrawSubmission - (*ProposalSubmission)(nil), // 15: vega.commands.v1.ProposalSubmission - (*BatchProposalSubmissionTerms)(nil), // 16: vega.commands.v1.BatchProposalSubmissionTerms - (*BatchProposalSubmission)(nil), // 17: vega.commands.v1.BatchProposalSubmission - (*VoteSubmission)(nil), // 18: vega.commands.v1.VoteSubmission - (*DelegateSubmission)(nil), // 19: vega.commands.v1.DelegateSubmission - (*UndelegateSubmission)(nil), // 20: vega.commands.v1.UndelegateSubmission - (*Transfer)(nil), // 21: vega.commands.v1.Transfer - (*OneOffTransfer)(nil), // 22: vega.commands.v1.OneOffTransfer - (*RecurringTransfer)(nil), // 23: vega.commands.v1.RecurringTransfer - (*CancelTransfer)(nil), // 24: vega.commands.v1.CancelTransfer - (*IssueSignatures)(nil), // 25: vega.commands.v1.IssueSignatures - (*CreateReferralSet)(nil), // 26: vega.commands.v1.CreateReferralSet - (*UpdateReferralSet)(nil), // 27: vega.commands.v1.UpdateReferralSet - (*ApplyReferralCode)(nil), // 28: vega.commands.v1.ApplyReferralCode - (*JoinTeam)(nil), // 29: vega.commands.v1.JoinTeam - (*UpdatePartyProfile)(nil), // 30: vega.commands.v1.UpdatePartyProfile - (*CreateReferralSet_Team)(nil), // 31: vega.commands.v1.CreateReferralSet.Team - (*UpdateReferralSet_Team)(nil), // 32: vega.commands.v1.UpdateReferralSet.Team - (vega.StopOrder_ExpiryStrategy)(0), // 33: vega.StopOrder.ExpiryStrategy - (vega.StopOrder_SizeOverrideSetting)(0), // 34: vega.StopOrder.SizeOverrideSetting - (*vega.StopOrder_SizeOverrideValue)(nil), // 35: vega.StopOrder.SizeOverrideValue - (vega.Side)(0), // 36: vega.Side - (vega.Order_TimeInForce)(0), // 37: vega.Order.TimeInForce - (vega.Order_Type)(0), // 38: vega.Order.Type - (*vega.PeggedOrder)(nil), // 39: vega.PeggedOrder - (vega.PeggedReference)(0), // 40: vega.PeggedReference - (*vega.WithdrawExt)(nil), // 41: vega.WithdrawExt - (*vega.ProposalTerms)(nil), // 42: vega.ProposalTerms - (*vega.ProposalRationale)(nil), // 43: vega.ProposalRationale - (*vega.BatchProposalTermsChange)(nil), // 44: vega.BatchProposalTermsChange - (vega.Vote_Value)(0), // 45: vega.Vote.Value - (vega.AccountType)(0), // 46: vega.AccountType - (*vega.DispatchStrategy)(nil), // 47: vega.DispatchStrategy - (NodeSignatureKind)(0), // 48: vega.commands.v1.NodeSignatureKind - (*vega.Metadata)(nil), // 49: vega.Metadata + (UpdateMarginMode_Mode)(0), // 0: vega.commands.v1.UpdateMarginMode.Mode + (UndelegateSubmission_Method)(0), // 1: vega.commands.v1.UndelegateSubmission.Method + (CancelAMM_Method)(0), // 2: vega.commands.v1.CancelAMM.Method + (*BatchMarketInstructions)(nil), // 3: vega.commands.v1.BatchMarketInstructions + (*StopOrdersSubmission)(nil), // 4: vega.commands.v1.StopOrdersSubmission + (*StopOrderSetup)(nil), // 5: vega.commands.v1.StopOrderSetup + (*StopOrdersCancellation)(nil), // 6: vega.commands.v1.StopOrdersCancellation + (*OrderSubmission)(nil), // 7: vega.commands.v1.OrderSubmission + (*IcebergOpts)(nil), // 8: vega.commands.v1.IcebergOpts + (*UpdateMarginMode)(nil), // 9: vega.commands.v1.UpdateMarginMode + (*OrderCancellation)(nil), // 10: vega.commands.v1.OrderCancellation + (*OrderAmendment)(nil), // 11: vega.commands.v1.OrderAmendment + (*LiquidityProvisionSubmission)(nil), // 12: vega.commands.v1.LiquidityProvisionSubmission + (*LiquidityProvisionCancellation)(nil), // 13: vega.commands.v1.LiquidityProvisionCancellation + (*LiquidityProvisionAmendment)(nil), // 14: vega.commands.v1.LiquidityProvisionAmendment + (*WithdrawSubmission)(nil), // 15: vega.commands.v1.WithdrawSubmission + (*ProposalSubmission)(nil), // 16: vega.commands.v1.ProposalSubmission + (*BatchProposalSubmissionTerms)(nil), // 17: vega.commands.v1.BatchProposalSubmissionTerms + (*BatchProposalSubmission)(nil), // 18: vega.commands.v1.BatchProposalSubmission + (*VoteSubmission)(nil), // 19: vega.commands.v1.VoteSubmission + (*DelegateSubmission)(nil), // 20: vega.commands.v1.DelegateSubmission + (*UndelegateSubmission)(nil), // 21: vega.commands.v1.UndelegateSubmission + (*Transfer)(nil), // 22: vega.commands.v1.Transfer + (*OneOffTransfer)(nil), // 23: vega.commands.v1.OneOffTransfer + (*RecurringTransfer)(nil), // 24: vega.commands.v1.RecurringTransfer + (*CancelTransfer)(nil), // 25: vega.commands.v1.CancelTransfer + (*IssueSignatures)(nil), // 26: vega.commands.v1.IssueSignatures + (*CreateReferralSet)(nil), // 27: vega.commands.v1.CreateReferralSet + (*UpdateReferralSet)(nil), // 28: vega.commands.v1.UpdateReferralSet + (*ApplyReferralCode)(nil), // 29: vega.commands.v1.ApplyReferralCode + (*JoinTeam)(nil), // 30: vega.commands.v1.JoinTeam + (*UpdatePartyProfile)(nil), // 31: vega.commands.v1.UpdatePartyProfile + (*SubmitAMM)(nil), // 32: vega.commands.v1.SubmitAMM + (*AmendAMM)(nil), // 33: vega.commands.v1.AmendAMM + (*CancelAMM)(nil), // 34: vega.commands.v1.CancelAMM + (*CreateReferralSet_Team)(nil), // 35: vega.commands.v1.CreateReferralSet.Team + (*UpdateReferralSet_Team)(nil), // 36: vega.commands.v1.UpdateReferralSet.Team + (*SubmitAMM_ConcentratedLiquidityParameters)(nil), // 37: vega.commands.v1.SubmitAMM.ConcentratedLiquidityParameters + (*AmendAMM_ConcentratedLiquidityParameters)(nil), // 38: vega.commands.v1.AmendAMM.ConcentratedLiquidityParameters + (vega.StopOrder_ExpiryStrategy)(0), // 39: vega.StopOrder.ExpiryStrategy + (vega.StopOrder_SizeOverrideSetting)(0), // 40: vega.StopOrder.SizeOverrideSetting + (*vega.StopOrder_SizeOverrideValue)(nil), // 41: vega.StopOrder.SizeOverrideValue + (vega.Side)(0), // 42: vega.Side + (vega.Order_TimeInForce)(0), // 43: vega.Order.TimeInForce + (vega.Order_Type)(0), // 44: vega.Order.Type + (*vega.PeggedOrder)(nil), // 45: vega.PeggedOrder + (vega.PeggedReference)(0), // 46: vega.PeggedReference + (*vega.WithdrawExt)(nil), // 47: vega.WithdrawExt + (*vega.ProposalTerms)(nil), // 48: vega.ProposalTerms + (*vega.ProposalRationale)(nil), // 49: vega.ProposalRationale + (*vega.BatchProposalTermsChange)(nil), // 50: vega.BatchProposalTermsChange + (vega.Vote_Value)(0), // 51: vega.Vote.Value + (vega.AccountType)(0), // 52: vega.AccountType + (*vega.DispatchStrategy)(nil), // 53: vega.DispatchStrategy + (NodeSignatureKind)(0), // 54: vega.commands.v1.NodeSignatureKind + (*vega.Metadata)(nil), // 55: vega.Metadata } var file_vega_commands_v1_commands_proto_depIdxs = []int32{ - 9, // 0: vega.commands.v1.BatchMarketInstructions.cancellations:type_name -> vega.commands.v1.OrderCancellation - 10, // 1: vega.commands.v1.BatchMarketInstructions.amendments:type_name -> vega.commands.v1.OrderAmendment - 6, // 2: vega.commands.v1.BatchMarketInstructions.submissions:type_name -> vega.commands.v1.OrderSubmission - 5, // 3: vega.commands.v1.BatchMarketInstructions.stop_orders_cancellation:type_name -> vega.commands.v1.StopOrdersCancellation - 3, // 4: vega.commands.v1.BatchMarketInstructions.stop_orders_submission:type_name -> vega.commands.v1.StopOrdersSubmission - 8, // 5: vega.commands.v1.BatchMarketInstructions.update_margin_mode:type_name -> vega.commands.v1.UpdateMarginMode - 4, // 6: vega.commands.v1.StopOrdersSubmission.rises_above:type_name -> vega.commands.v1.StopOrderSetup - 4, // 7: vega.commands.v1.StopOrdersSubmission.falls_below:type_name -> vega.commands.v1.StopOrderSetup - 6, // 8: vega.commands.v1.StopOrderSetup.order_submission:type_name -> vega.commands.v1.OrderSubmission - 33, // 9: vega.commands.v1.StopOrderSetup.expiry_strategy:type_name -> vega.StopOrder.ExpiryStrategy - 34, // 10: vega.commands.v1.StopOrderSetup.size_override_setting:type_name -> vega.StopOrder.SizeOverrideSetting - 35, // 11: vega.commands.v1.StopOrderSetup.size_override_value:type_name -> vega.StopOrder.SizeOverrideValue - 36, // 12: vega.commands.v1.OrderSubmission.side:type_name -> vega.Side - 37, // 13: vega.commands.v1.OrderSubmission.time_in_force:type_name -> vega.Order.TimeInForce - 38, // 14: vega.commands.v1.OrderSubmission.type:type_name -> vega.Order.Type - 39, // 15: vega.commands.v1.OrderSubmission.pegged_order:type_name -> vega.PeggedOrder - 7, // 16: vega.commands.v1.OrderSubmission.iceberg_opts:type_name -> vega.commands.v1.IcebergOpts + 10, // 0: vega.commands.v1.BatchMarketInstructions.cancellations:type_name -> vega.commands.v1.OrderCancellation + 11, // 1: vega.commands.v1.BatchMarketInstructions.amendments:type_name -> vega.commands.v1.OrderAmendment + 7, // 2: vega.commands.v1.BatchMarketInstructions.submissions:type_name -> vega.commands.v1.OrderSubmission + 6, // 3: vega.commands.v1.BatchMarketInstructions.stop_orders_cancellation:type_name -> vega.commands.v1.StopOrdersCancellation + 4, // 4: vega.commands.v1.BatchMarketInstructions.stop_orders_submission:type_name -> vega.commands.v1.StopOrdersSubmission + 9, // 5: vega.commands.v1.BatchMarketInstructions.update_margin_mode:type_name -> vega.commands.v1.UpdateMarginMode + 5, // 6: vega.commands.v1.StopOrdersSubmission.rises_above:type_name -> vega.commands.v1.StopOrderSetup + 5, // 7: vega.commands.v1.StopOrdersSubmission.falls_below:type_name -> vega.commands.v1.StopOrderSetup + 7, // 8: vega.commands.v1.StopOrderSetup.order_submission:type_name -> vega.commands.v1.OrderSubmission + 39, // 9: vega.commands.v1.StopOrderSetup.expiry_strategy:type_name -> vega.StopOrder.ExpiryStrategy + 40, // 10: vega.commands.v1.StopOrderSetup.size_override_setting:type_name -> vega.StopOrder.SizeOverrideSetting + 41, // 11: vega.commands.v1.StopOrderSetup.size_override_value:type_name -> vega.StopOrder.SizeOverrideValue + 42, // 12: vega.commands.v1.OrderSubmission.side:type_name -> vega.Side + 43, // 13: vega.commands.v1.OrderSubmission.time_in_force:type_name -> vega.Order.TimeInForce + 44, // 14: vega.commands.v1.OrderSubmission.type:type_name -> vega.Order.Type + 45, // 15: vega.commands.v1.OrderSubmission.pegged_order:type_name -> vega.PeggedOrder + 8, // 16: vega.commands.v1.OrderSubmission.iceberg_opts:type_name -> vega.commands.v1.IcebergOpts 0, // 17: vega.commands.v1.UpdateMarginMode.mode:type_name -> vega.commands.v1.UpdateMarginMode.Mode - 37, // 18: vega.commands.v1.OrderAmendment.time_in_force:type_name -> vega.Order.TimeInForce - 40, // 19: vega.commands.v1.OrderAmendment.pegged_reference:type_name -> vega.PeggedReference - 41, // 20: vega.commands.v1.WithdrawSubmission.ext:type_name -> vega.WithdrawExt - 42, // 21: vega.commands.v1.ProposalSubmission.terms:type_name -> vega.ProposalTerms - 43, // 22: vega.commands.v1.ProposalSubmission.rationale:type_name -> vega.ProposalRationale - 44, // 23: vega.commands.v1.BatchProposalSubmissionTerms.changes:type_name -> vega.BatchProposalTermsChange - 16, // 24: vega.commands.v1.BatchProposalSubmission.terms:type_name -> vega.commands.v1.BatchProposalSubmissionTerms - 43, // 25: vega.commands.v1.BatchProposalSubmission.rationale:type_name -> vega.ProposalRationale - 45, // 26: vega.commands.v1.VoteSubmission.value:type_name -> vega.Vote.Value + 43, // 18: vega.commands.v1.OrderAmendment.time_in_force:type_name -> vega.Order.TimeInForce + 46, // 19: vega.commands.v1.OrderAmendment.pegged_reference:type_name -> vega.PeggedReference + 47, // 20: vega.commands.v1.WithdrawSubmission.ext:type_name -> vega.WithdrawExt + 48, // 21: vega.commands.v1.ProposalSubmission.terms:type_name -> vega.ProposalTerms + 49, // 22: vega.commands.v1.ProposalSubmission.rationale:type_name -> vega.ProposalRationale + 50, // 23: vega.commands.v1.BatchProposalSubmissionTerms.changes:type_name -> vega.BatchProposalTermsChange + 17, // 24: vega.commands.v1.BatchProposalSubmission.terms:type_name -> vega.commands.v1.BatchProposalSubmissionTerms + 49, // 25: vega.commands.v1.BatchProposalSubmission.rationale:type_name -> vega.ProposalRationale + 51, // 26: vega.commands.v1.VoteSubmission.value:type_name -> vega.Vote.Value 1, // 27: vega.commands.v1.UndelegateSubmission.method:type_name -> vega.commands.v1.UndelegateSubmission.Method - 46, // 28: vega.commands.v1.Transfer.from_account_type:type_name -> vega.AccountType - 46, // 29: vega.commands.v1.Transfer.to_account_type:type_name -> vega.AccountType - 22, // 30: vega.commands.v1.Transfer.one_off:type_name -> vega.commands.v1.OneOffTransfer - 23, // 31: vega.commands.v1.Transfer.recurring:type_name -> vega.commands.v1.RecurringTransfer - 47, // 32: vega.commands.v1.RecurringTransfer.dispatch_strategy:type_name -> vega.DispatchStrategy - 48, // 33: vega.commands.v1.IssueSignatures.kind:type_name -> vega.commands.v1.NodeSignatureKind - 31, // 34: vega.commands.v1.CreateReferralSet.team:type_name -> vega.commands.v1.CreateReferralSet.Team - 32, // 35: vega.commands.v1.UpdateReferralSet.team:type_name -> vega.commands.v1.UpdateReferralSet.Team - 49, // 36: vega.commands.v1.UpdatePartyProfile.metadata:type_name -> vega.Metadata - 37, // [37:37] is the sub-list for method output_type - 37, // [37:37] is the sub-list for method input_type - 37, // [37:37] is the sub-list for extension type_name - 37, // [37:37] is the sub-list for extension extendee - 0, // [0:37] is the sub-list for field type_name + 52, // 28: vega.commands.v1.Transfer.from_account_type:type_name -> vega.AccountType + 52, // 29: vega.commands.v1.Transfer.to_account_type:type_name -> vega.AccountType + 23, // 30: vega.commands.v1.Transfer.one_off:type_name -> vega.commands.v1.OneOffTransfer + 24, // 31: vega.commands.v1.Transfer.recurring:type_name -> vega.commands.v1.RecurringTransfer + 53, // 32: vega.commands.v1.RecurringTransfer.dispatch_strategy:type_name -> vega.DispatchStrategy + 54, // 33: vega.commands.v1.IssueSignatures.kind:type_name -> vega.commands.v1.NodeSignatureKind + 35, // 34: vega.commands.v1.CreateReferralSet.team:type_name -> vega.commands.v1.CreateReferralSet.Team + 36, // 35: vega.commands.v1.UpdateReferralSet.team:type_name -> vega.commands.v1.UpdateReferralSet.Team + 55, // 36: vega.commands.v1.UpdatePartyProfile.metadata:type_name -> vega.Metadata + 37, // 37: vega.commands.v1.SubmitAMM.concentrated_liquidity_parameters:type_name -> vega.commands.v1.SubmitAMM.ConcentratedLiquidityParameters + 38, // 38: vega.commands.v1.AmendAMM.concentrated_liquidity_parameters:type_name -> vega.commands.v1.AmendAMM.ConcentratedLiquidityParameters + 2, // 39: vega.commands.v1.CancelAMM.method:type_name -> vega.commands.v1.CancelAMM.Method + 40, // [40:40] is the sub-list for method output_type + 40, // [40:40] is the sub-list for method input_type + 40, // [40:40] is the sub-list for extension type_name + 40, // [40:40] is the sub-list for extension extendee + 0, // [0:40] is the sub-list for field type_name } func init() { file_vega_commands_v1_commands_proto_init() } @@ -3297,7 +3856,7 @@ func file_vega_commands_v1_commands_proto_init() { } } file_vega_commands_v1_commands_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateReferralSet_Team); i { + switch v := v.(*SubmitAMM); i { case 0: return &v.state case 1: @@ -3309,6 +3868,42 @@ func file_vega_commands_v1_commands_proto_init() { } } file_vega_commands_v1_commands_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AmendAMM); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_commands_v1_commands_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CancelAMM); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_commands_v1_commands_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateReferralSet_Team); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_commands_v1_commands_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateReferralSet_Team); i { case 0: return &v.state @@ -3320,6 +3915,30 @@ func file_vega_commands_v1_commands_proto_init() { return nil } } + file_vega_commands_v1_commands_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubmitAMM_ConcentratedLiquidityParameters); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_commands_v1_commands_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AmendAMM_ConcentratedLiquidityParameters); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_vega_commands_v1_commands_proto_msgTypes[1].OneofWrappers = []interface{}{} file_vega_commands_v1_commands_proto_msgTypes[2].OneofWrappers = []interface{}{ @@ -3337,15 +3956,18 @@ func file_vega_commands_v1_commands_proto_init() { file_vega_commands_v1_commands_proto_msgTypes[21].OneofWrappers = []interface{}{} file_vega_commands_v1_commands_proto_msgTypes[24].OneofWrappers = []interface{}{} file_vega_commands_v1_commands_proto_msgTypes[25].OneofWrappers = []interface{}{} - file_vega_commands_v1_commands_proto_msgTypes[29].OneofWrappers = []interface{}{} file_vega_commands_v1_commands_proto_msgTypes[30].OneofWrappers = []interface{}{} + file_vega_commands_v1_commands_proto_msgTypes[32].OneofWrappers = []interface{}{} + file_vega_commands_v1_commands_proto_msgTypes[33].OneofWrappers = []interface{}{} + file_vega_commands_v1_commands_proto_msgTypes[34].OneofWrappers = []interface{}{} + file_vega_commands_v1_commands_proto_msgTypes[35].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vega_commands_v1_commands_proto_rawDesc, - NumEnums: 2, - NumMessages: 31, + NumEnums: 3, + NumMessages: 36, NumExtensions: 0, NumServices: 0, }, diff --git a/protos/vega/commands/v1/transaction.pb.go b/protos/vega/commands/v1/transaction.pb.go index ad0e30c0c87..be8fcf8961e 100644 --- a/protos/vega/commands/v1/transaction.pb.go +++ b/protos/vega/commands/v1/transaction.pb.go @@ -111,6 +111,9 @@ type InputData struct { // *InputData_JoinTeam // *InputData_BatchProposalSubmission // *InputData_UpdatePartyProfile + // *InputData_SubmitAmm + // *InputData_AmendAmm + // *InputData_CancelAmm // *InputData_NodeVote // *InputData_NodeSignature // *InputData_ChainEvent @@ -345,6 +348,27 @@ func (x *InputData) GetUpdatePartyProfile() *UpdatePartyProfile { return nil } +func (x *InputData) GetSubmitAmm() *SubmitAMM { + if x, ok := x.GetCommand().(*InputData_SubmitAmm); ok { + return x.SubmitAmm + } + return nil +} + +func (x *InputData) GetAmendAmm() *AmendAMM { + if x, ok := x.GetCommand().(*InputData_AmendAmm); ok { + return x.AmendAmm + } + return nil +} + +func (x *InputData) GetCancelAmm() *CancelAMM { + if x, ok := x.GetCommand().(*InputData_CancelAmm); ok { + return x.CancelAmm + } + return nil +} + func (x *InputData) GetNodeVote() *NodeVote { if x, ok := x.GetCommand().(*InputData_NodeVote); ok { return x.NodeVote @@ -539,6 +563,21 @@ type InputData_UpdatePartyProfile struct { UpdatePartyProfile *UpdatePartyProfile `protobuf:"bytes,1024,opt,name=update_party_profile,json=updatePartyProfile,proto3,oneof"` } +type InputData_SubmitAmm struct { + // Command to submit an AMM pool to a market + SubmitAmm *SubmitAMM `protobuf:"bytes,1025,opt,name=submit_amm,json=submitAmm,proto3,oneof"` +} + +type InputData_AmendAmm struct { + // Command to amend an AMM pool on a market + AmendAmm *AmendAMM `protobuf:"bytes,1026,opt,name=amend_amm,json=amendAmm,proto3,oneof"` +} + +type InputData_CancelAmm struct { + // Command to cancel an AMM pool on a market + CancelAmm *CancelAMM `protobuf:"bytes,1027,opt,name=cancel_amm,json=cancelAmm,proto3,oneof"` +} + type InputData_NodeVote struct { // Validator command sent automatically to vote on that validity of an external resource. NodeVote *NodeVote `protobuf:"bytes,2002,opt,name=node_vote,json=nodeVote,proto3,oneof"` @@ -637,6 +676,12 @@ func (*InputData_BatchProposalSubmission) isInputData_Command() {} func (*InputData_UpdatePartyProfile) isInputData_Command() {} +func (*InputData_SubmitAmm) isInputData_Command() {} + +func (*InputData_AmendAmm) isInputData_Command() {} + +func (*InputData_CancelAmm) isInputData_Command() {} + func (*InputData_NodeVote) isInputData_Command() {} func (*InputData_NodeSignature) isInputData_Command() {} @@ -854,7 +899,7 @@ var file_vega_commands_v1_transaction_proto_rawDesc = []byte{ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0xd0, 0x18, 0x0a, 0x09, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x6f, 0x22, 0x8a, 0x1a, 0x0a, 0x09, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, @@ -994,94 +1039,105 @@ var file_vega_commands_v1_transaction_proto_rawDesc = []byte{ 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, - 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x18, 0xd2, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x6f, 0x74, 0x65, 0x48, 0x00, 0x52, 0x08, 0x6e, 0x6f, 0x64, - 0x65, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x49, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0xd3, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x73, 0x75, 0x62, + 0x6d, 0x69, 0x74, 0x5f, 0x61, 0x6d, 0x6d, 0x18, 0x81, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x48, - 0x00, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, - 0xd4, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x5c, 0x0a, 0x15, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, - 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xd5, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x13, 0x6b, 0x65, 0x79, + 0x31, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x41, 0x4d, 0x4d, 0x48, 0x00, 0x52, 0x09, 0x73, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x41, 0x6d, 0x6d, 0x12, 0x3a, 0x0a, 0x09, 0x61, 0x6d, 0x65, 0x6e, + 0x64, 0x5f, 0x61, 0x6d, 0x6d, 0x18, 0x82, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x6d, 0x65, 0x6e, 0x64, 0x41, 0x4d, 0x4d, 0x48, 0x00, 0x52, 0x08, 0x61, 0x6d, 0x65, 0x6e, + 0x64, 0x41, 0x6d, 0x6d, 0x12, 0x3d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x61, + 0x6d, 0x6d, 0x18, 0x83, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, + 0x63, 0x65, 0x6c, 0x41, 0x4d, 0x4d, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, + 0x41, 0x6d, 0x6d, 0x12, 0x3a, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x76, 0x6f, 0x74, 0x65, + 0x18, 0xd2, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x56, + 0x6f, 0x74, 0x65, 0x48, 0x00, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x56, 0x6f, 0x74, 0x65, 0x12, + 0x49, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x18, 0xd3, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x6e, 0x6f, 0x64, + 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0xd4, 0x0f, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5c, 0x0a, 0x15, + 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xd5, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x13, 0x6b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, + 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x62, 0x0a, 0x17, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0xd6, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x15, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x58, + 0x0a, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x68, 0x65, 0x61, 0x72, + 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0xd7, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x48, 0x00, 0x52, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x48, + 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x75, 0x0a, 0x1e, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x5f, + 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xd8, 0x0f, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x62, 0x0a, 0x17, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0xd6, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x15, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x58, 0x0a, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0xd7, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x48, - 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x12, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x75, - 0x0a, 0x1e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, - 0x6f, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0xd8, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x1b, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x68, 0x0a, 0x19, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x18, 0xd9, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, - 0x4f, 0x0a, 0x10, 0x69, 0x73, 0x73, 0x75, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x18, 0xda, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, - 0x73, 0x75, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x48, 0x00, 0x52, - 0x0f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x12, 0x5f, 0x0a, 0x16, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xb9, 0x17, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x14, 0x6f, 0x72, 0x61, - 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4a, 0x06, 0x08, 0xa1, - 0x1f, 0x10, 0xa2, 0x1f, 0x22, 0x92, 0x02, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x39, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1b, - 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x07, 0x70, - 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0xd0, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x78, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x30, 0x0a, 0x03, 0x70, 0x6f, 0x77, 0x18, 0xb8, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x52, 0x03, 0x70, 0x6f, - 0x77, 0x42, 0x06, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x22, 0x35, 0x0a, 0x0b, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, - 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, - 0x2a, 0x53, 0x0a, 0x09, 0x54, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, - 0x16, 0x54, 0x58, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x58, 0x5f, - 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x32, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, - 0x54, 0x58, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x33, 0x10, 0x03, 0x22, - 0x04, 0x08, 0x01, 0x10, 0x01, 0x42, 0x33, 0x5a, 0x31, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, - 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x48, 0x00, 0x52, 0x1b, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, + 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x68, 0x0a, 0x19, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0xd9, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x48, 0x00, + 0x52, 0x17, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x4f, 0x0a, 0x10, 0x69, 0x73, 0x73, + 0x75, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0xda, 0x0f, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x69, 0x73, 0x73, 0x75, 0x65, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x16, 0x6f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xb9, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x14, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4a, 0x06, 0x08, 0xa1, 0x1f, 0x10, 0xa2, 0x1f, 0x22, 0x92, + 0x02, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, + 0x0a, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x39, 0x0a, + 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, + 0x79, 0x12, 0x36, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xd0, 0x0f, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x78, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x03, 0x70, 0x6f, 0x77, + 0x18, 0xb8, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x52, 0x03, 0x70, 0x6f, 0x77, 0x42, 0x06, 0x0a, 0x04, 0x66, + 0x72, 0x6f, 0x6d, 0x22, 0x35, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, + 0x72, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x74, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x2a, 0x53, 0x0a, 0x09, 0x54, 0x78, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x58, 0x5f, 0x56, 0x45, + 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x58, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, + 0x4e, 0x5f, 0x56, 0x32, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x58, 0x5f, 0x56, 0x45, 0x52, + 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x33, 0x10, 0x03, 0x22, 0x04, 0x08, 0x01, 0x10, 0x01, 0x42, + 0x33, 0x5a, 0x31, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1127,17 +1183,20 @@ var file_vega_commands_v1_transaction_proto_goTypes = []interface{}{ (*JoinTeam)(nil), // 25: vega.commands.v1.JoinTeam (*BatchProposalSubmission)(nil), // 26: vega.commands.v1.BatchProposalSubmission (*UpdatePartyProfile)(nil), // 27: vega.commands.v1.UpdatePartyProfile - (*NodeVote)(nil), // 28: vega.commands.v1.NodeVote - (*NodeSignature)(nil), // 29: vega.commands.v1.NodeSignature - (*ChainEvent)(nil), // 30: vega.commands.v1.ChainEvent - (*KeyRotateSubmission)(nil), // 31: vega.commands.v1.KeyRotateSubmission - (*StateVariableProposal)(nil), // 32: vega.commands.v1.StateVariableProposal - (*ValidatorHeartbeat)(nil), // 33: vega.commands.v1.ValidatorHeartbeat - (*EthereumKeyRotateSubmission)(nil), // 34: vega.commands.v1.EthereumKeyRotateSubmission - (*ProtocolUpgradeProposal)(nil), // 35: vega.commands.v1.ProtocolUpgradeProposal - (*IssueSignatures)(nil), // 36: vega.commands.v1.IssueSignatures - (*OracleDataSubmission)(nil), // 37: vega.commands.v1.OracleDataSubmission - (*Signature)(nil), // 38: vega.commands.v1.Signature + (*SubmitAMM)(nil), // 28: vega.commands.v1.SubmitAMM + (*AmendAMM)(nil), // 29: vega.commands.v1.AmendAMM + (*CancelAMM)(nil), // 30: vega.commands.v1.CancelAMM + (*NodeVote)(nil), // 31: vega.commands.v1.NodeVote + (*NodeSignature)(nil), // 32: vega.commands.v1.NodeSignature + (*ChainEvent)(nil), // 33: vega.commands.v1.ChainEvent + (*KeyRotateSubmission)(nil), // 34: vega.commands.v1.KeyRotateSubmission + (*StateVariableProposal)(nil), // 35: vega.commands.v1.StateVariableProposal + (*ValidatorHeartbeat)(nil), // 36: vega.commands.v1.ValidatorHeartbeat + (*EthereumKeyRotateSubmission)(nil), // 37: vega.commands.v1.EthereumKeyRotateSubmission + (*ProtocolUpgradeProposal)(nil), // 38: vega.commands.v1.ProtocolUpgradeProposal + (*IssueSignatures)(nil), // 39: vega.commands.v1.IssueSignatures + (*OracleDataSubmission)(nil), // 40: vega.commands.v1.OracleDataSubmission + (*Signature)(nil), // 41: vega.commands.v1.Signature } var file_vega_commands_v1_transaction_proto_depIdxs = []int32{ 4, // 0: vega.commands.v1.InputData.order_submission:type_name -> vega.commands.v1.OrderSubmission @@ -1164,24 +1223,27 @@ var file_vega_commands_v1_transaction_proto_depIdxs = []int32{ 25, // 21: vega.commands.v1.InputData.join_team:type_name -> vega.commands.v1.JoinTeam 26, // 22: vega.commands.v1.InputData.batch_proposal_submission:type_name -> vega.commands.v1.BatchProposalSubmission 27, // 23: vega.commands.v1.InputData.update_party_profile:type_name -> vega.commands.v1.UpdatePartyProfile - 28, // 24: vega.commands.v1.InputData.node_vote:type_name -> vega.commands.v1.NodeVote - 29, // 25: vega.commands.v1.InputData.node_signature:type_name -> vega.commands.v1.NodeSignature - 30, // 26: vega.commands.v1.InputData.chain_event:type_name -> vega.commands.v1.ChainEvent - 31, // 27: vega.commands.v1.InputData.key_rotate_submission:type_name -> vega.commands.v1.KeyRotateSubmission - 32, // 28: vega.commands.v1.InputData.state_variable_proposal:type_name -> vega.commands.v1.StateVariableProposal - 33, // 29: vega.commands.v1.InputData.validator_heartbeat:type_name -> vega.commands.v1.ValidatorHeartbeat - 34, // 30: vega.commands.v1.InputData.ethereum_key_rotate_submission:type_name -> vega.commands.v1.EthereumKeyRotateSubmission - 35, // 31: vega.commands.v1.InputData.protocol_upgrade_proposal:type_name -> vega.commands.v1.ProtocolUpgradeProposal - 36, // 32: vega.commands.v1.InputData.issue_signatures:type_name -> vega.commands.v1.IssueSignatures - 37, // 33: vega.commands.v1.InputData.oracle_data_submission:type_name -> vega.commands.v1.OracleDataSubmission - 38, // 34: vega.commands.v1.Transaction.signature:type_name -> vega.commands.v1.Signature - 0, // 35: vega.commands.v1.Transaction.version:type_name -> vega.commands.v1.TxVersion - 3, // 36: vega.commands.v1.Transaction.pow:type_name -> vega.commands.v1.ProofOfWork - 37, // [37:37] is the sub-list for method output_type - 37, // [37:37] is the sub-list for method input_type - 37, // [37:37] is the sub-list for extension type_name - 37, // [37:37] is the sub-list for extension extendee - 0, // [0:37] is the sub-list for field type_name + 28, // 24: vega.commands.v1.InputData.submit_amm:type_name -> vega.commands.v1.SubmitAMM + 29, // 25: vega.commands.v1.InputData.amend_amm:type_name -> vega.commands.v1.AmendAMM + 30, // 26: vega.commands.v1.InputData.cancel_amm:type_name -> vega.commands.v1.CancelAMM + 31, // 27: vega.commands.v1.InputData.node_vote:type_name -> vega.commands.v1.NodeVote + 32, // 28: vega.commands.v1.InputData.node_signature:type_name -> vega.commands.v1.NodeSignature + 33, // 29: vega.commands.v1.InputData.chain_event:type_name -> vega.commands.v1.ChainEvent + 34, // 30: vega.commands.v1.InputData.key_rotate_submission:type_name -> vega.commands.v1.KeyRotateSubmission + 35, // 31: vega.commands.v1.InputData.state_variable_proposal:type_name -> vega.commands.v1.StateVariableProposal + 36, // 32: vega.commands.v1.InputData.validator_heartbeat:type_name -> vega.commands.v1.ValidatorHeartbeat + 37, // 33: vega.commands.v1.InputData.ethereum_key_rotate_submission:type_name -> vega.commands.v1.EthereumKeyRotateSubmission + 38, // 34: vega.commands.v1.InputData.protocol_upgrade_proposal:type_name -> vega.commands.v1.ProtocolUpgradeProposal + 39, // 35: vega.commands.v1.InputData.issue_signatures:type_name -> vega.commands.v1.IssueSignatures + 40, // 36: vega.commands.v1.InputData.oracle_data_submission:type_name -> vega.commands.v1.OracleDataSubmission + 41, // 37: vega.commands.v1.Transaction.signature:type_name -> vega.commands.v1.Signature + 0, // 38: vega.commands.v1.Transaction.version:type_name -> vega.commands.v1.TxVersion + 3, // 39: vega.commands.v1.Transaction.pow:type_name -> vega.commands.v1.ProofOfWork + 40, // [40:40] is the sub-list for method output_type + 40, // [40:40] is the sub-list for method input_type + 40, // [40:40] is the sub-list for extension type_name + 40, // [40:40] is the sub-list for extension extendee + 0, // [0:40] is the sub-list for field type_name } func init() { file_vega_commands_v1_transaction_proto_init() } @@ -1256,6 +1318,9 @@ func file_vega_commands_v1_transaction_proto_init() { (*InputData_JoinTeam)(nil), (*InputData_BatchProposalSubmission)(nil), (*InputData_UpdatePartyProfile)(nil), + (*InputData_SubmitAmm)(nil), + (*InputData_AmendAmm)(nil), + (*InputData_CancelAmm)(nil), (*InputData_NodeVote)(nil), (*InputData_NodeSignature)(nil), (*InputData_ChainEvent)(nil), diff --git a/protos/vega/events/v1/events.pb.go b/protos/vega/events/v1/events.pb.go index 6481d218ee8..7f8238ef668 100644 --- a/protos/vega/events/v1/events.pb.go +++ b/protos/vega/events/v1/events.pb.go @@ -264,6 +264,8 @@ const ( BusEventType_BUS_EVENT_TYPE_TIME_WEIGHTED_NOTIONAL_POSITION_UPDATED BusEventType = 88 // Event containing the IDs of orders cancelled by a party on a market. BusEventType_BUS_EVENT_TYPE_CANCELLED_ORDERS BusEventType = 89 + // Event use to notify for a amm pool update. + BusEventType_BUS_EVENT_TYPE_AMM_POOL BusEventType = 90 // Event indicating a market related event, for example when a market opens BusEventType_BUS_EVENT_TYPE_MARKET BusEventType = 101 // Event used to report failed transactions back to a user, this is excluded from the ALL type @@ -363,6 +365,7 @@ var ( 87: "BUS_EVENT_TYPE_TEAMS_STATS_UPDATED", 88: "BUS_EVENT_TYPE_TIME_WEIGHTED_NOTIONAL_POSITION_UPDATED", 89: "BUS_EVENT_TYPE_CANCELLED_ORDERS", + 90: "BUS_EVENT_TYPE_AMM_POOL", 101: "BUS_EVENT_TYPE_MARKET", 201: "BUS_EVENT_TYPE_TX_ERROR", } @@ -457,6 +460,7 @@ var ( "BUS_EVENT_TYPE_TEAMS_STATS_UPDATED": 87, "BUS_EVENT_TYPE_TIME_WEIGHTED_NOTIONAL_POSITION_UPDATED": 88, "BUS_EVENT_TYPE_CANCELLED_ORDERS": 89, + "BUS_EVENT_TYPE_AMM_POOL": 90, "BUS_EVENT_TYPE_MARKET": 101, "BUS_EVENT_TYPE_TX_ERROR": 201, } @@ -489,6 +493,140 @@ func (BusEventType) EnumDescriptor() ([]byte, []int) { return file_vega_events_v1_events_proto_rawDescGZIP(), []int{1} } +type AMMPool_Status int32 + +const ( + AMMPool_STATUS_UNSPECIFIED AMMPool_Status = 0 + // AMM is active on the market and can be traded against. + AMMPool_STATUS_ACTIVE AMMPool_Status = 1 + // AMM submission was rejected. + AMMPool_STATUS_REJECTED AMMPool_Status = 2 + // AMM has been cancelled by the owner and is no longer trading. + AMMPool_STATUS_CANCELLED AMMPool_Status = 3 + // AMM has been stopped by the network and is no longer trading. + AMMPool_STATUS_STOPPED AMMPool_Status = 4 + // AMM will only trade such that it will reduce its position. + AMMPool_STATUS_REDUCE_ONLY AMMPool_Status = 5 +) + +// Enum value maps for AMMPool_Status. +var ( + AMMPool_Status_name = map[int32]string{ + 0: "STATUS_UNSPECIFIED", + 1: "STATUS_ACTIVE", + 2: "STATUS_REJECTED", + 3: "STATUS_CANCELLED", + 4: "STATUS_STOPPED", + 5: "STATUS_REDUCE_ONLY", + } + AMMPool_Status_value = map[string]int32{ + "STATUS_UNSPECIFIED": 0, + "STATUS_ACTIVE": 1, + "STATUS_REJECTED": 2, + "STATUS_CANCELLED": 3, + "STATUS_STOPPED": 4, + "STATUS_REDUCE_ONLY": 5, + } +) + +func (x AMMPool_Status) Enum() *AMMPool_Status { + p := new(AMMPool_Status) + *p = x + return p +} + +func (x AMMPool_Status) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AMMPool_Status) Descriptor() protoreflect.EnumDescriptor { + return file_vega_events_v1_events_proto_enumTypes[2].Descriptor() +} + +func (AMMPool_Status) Type() protoreflect.EnumType { + return &file_vega_events_v1_events_proto_enumTypes[2] +} + +func (x AMMPool_Status) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AMMPool_Status.Descriptor instead. +func (AMMPool_Status) EnumDescriptor() ([]byte, []int) { + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{1, 0} +} + +type AMMPool_StatusReason int32 + +const ( + AMMPool_STATUS_REASON_UNSPECIFIED AMMPool_StatusReason = 0 + // AMM was cancelled by the owner of the AMM. + AMMPool_STATUS_REASON_CANCELLED_BY_PARTY AMMPool_StatusReason = 1 + // Party does not have enough funds in their general account to meet the AMM's commitment. + AMMPool_STATUS_REASON_CANNOT_FILL_COMMITMENT AMMPool_StatusReason = 2 + // Party already has an AMM operating on this market and cannot create another one. + AMMPool_STATUS_REASON_PARTY_ALREADY_OWNS_A_POOL AMMPool_StatusReason = 3 + // AMM was liquidated and stopped by the network. + AMMPool_STATUS_REASON_PARTY_CLOSED_OUT AMMPool_StatusReason = 4 + // AMM was stopped by the network because the market it operated in was closed. + AMMPool_STATUS_REASON_MARKET_CLOSED AMMPool_StatusReason = 5 + // Party does not have enough funds in their general account to meet the AMM's commitment. + AMMPool_STATUS_REASON_COMMITMENT_TOO_LOW AMMPool_StatusReason = 6 + // AMM was unable to rebase its fair-price such that it does no enter crossed. + AMMPool_STATUS_REASON_CANNOT_REBASE AMMPool_StatusReason = 7 +) + +// Enum value maps for AMMPool_StatusReason. +var ( + AMMPool_StatusReason_name = map[int32]string{ + 0: "STATUS_REASON_UNSPECIFIED", + 1: "STATUS_REASON_CANCELLED_BY_PARTY", + 2: "STATUS_REASON_CANNOT_FILL_COMMITMENT", + 3: "STATUS_REASON_PARTY_ALREADY_OWNS_A_POOL", + 4: "STATUS_REASON_PARTY_CLOSED_OUT", + 5: "STATUS_REASON_MARKET_CLOSED", + 6: "STATUS_REASON_COMMITMENT_TOO_LOW", + 7: "STATUS_REASON_CANNOT_REBASE", + } + AMMPool_StatusReason_value = map[string]int32{ + "STATUS_REASON_UNSPECIFIED": 0, + "STATUS_REASON_CANCELLED_BY_PARTY": 1, + "STATUS_REASON_CANNOT_FILL_COMMITMENT": 2, + "STATUS_REASON_PARTY_ALREADY_OWNS_A_POOL": 3, + "STATUS_REASON_PARTY_CLOSED_OUT": 4, + "STATUS_REASON_MARKET_CLOSED": 5, + "STATUS_REASON_COMMITMENT_TOO_LOW": 6, + "STATUS_REASON_CANNOT_REBASE": 7, + } +) + +func (x AMMPool_StatusReason) Enum() *AMMPool_StatusReason { + p := new(AMMPool_StatusReason) + *p = x + return p +} + +func (x AMMPool_StatusReason) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AMMPool_StatusReason) Descriptor() protoreflect.EnumDescriptor { + return file_vega_events_v1_events_proto_enumTypes[3].Descriptor() +} + +func (AMMPool_StatusReason) Type() protoreflect.EnumType { + return &file_vega_events_v1_events_proto_enumTypes[3] +} + +func (x AMMPool_StatusReason) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AMMPool_StatusReason.Descriptor instead. +func (AMMPool_StatusReason) EnumDescriptor() ([]byte, []int) { + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{1, 1} +} + type FundingPeriodDataPoint_Source int32 const ( @@ -525,11 +663,11 @@ func (x FundingPeriodDataPoint_Source) String() string { } func (FundingPeriodDataPoint_Source) Descriptor() protoreflect.EnumDescriptor { - return file_vega_events_v1_events_proto_enumTypes[2].Descriptor() + return file_vega_events_v1_events_proto_enumTypes[4].Descriptor() } func (FundingPeriodDataPoint_Source) Type() protoreflect.EnumType { - return &file_vega_events_v1_events_proto_enumTypes[2] + return &file_vega_events_v1_events_proto_enumTypes[4] } func (x FundingPeriodDataPoint_Source) Number() protoreflect.EnumNumber { @@ -538,7 +676,7 @@ func (x FundingPeriodDataPoint_Source) Number() protoreflect.EnumNumber { // Deprecated: Use FundingPeriodDataPoint_Source.Descriptor instead. func (FundingPeriodDataPoint_Source) EnumDescriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{17, 0} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{18, 0} } type Transfer_Status int32 @@ -590,11 +728,11 @@ func (x Transfer_Status) String() string { } func (Transfer_Status) Descriptor() protoreflect.EnumDescriptor { - return file_vega_events_v1_events_proto_enumTypes[3].Descriptor() + return file_vega_events_v1_events_proto_enumTypes[5].Descriptor() } func (Transfer_Status) Type() protoreflect.EnumType { - return &file_vega_events_v1_events_proto_enumTypes[3] + return &file_vega_events_v1_events_proto_enumTypes[5] } func (x Transfer_Status) Number() protoreflect.EnumNumber { @@ -603,7 +741,7 @@ func (x Transfer_Status) Number() protoreflect.EnumNumber { // Deprecated: Use Transfer_Status.Descriptor instead. func (Transfer_Status) EnumDescriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{22, 0} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{23, 0} } type StakeLinking_Type int32 @@ -642,11 +780,11 @@ func (x StakeLinking_Type) String() string { } func (StakeLinking_Type) Descriptor() protoreflect.EnumDescriptor { - return file_vega_events_v1_events_proto_enumTypes[4].Descriptor() + return file_vega_events_v1_events_proto_enumTypes[6].Descriptor() } func (StakeLinking_Type) Type() protoreflect.EnumType { - return &file_vega_events_v1_events_proto_enumTypes[4] + return &file_vega_events_v1_events_proto_enumTypes[6] } func (x StakeLinking_Type) Number() protoreflect.EnumNumber { @@ -655,7 +793,7 @@ func (x StakeLinking_Type) Number() protoreflect.EnumNumber { // Deprecated: Use StakeLinking_Type.Descriptor instead. func (StakeLinking_Type) EnumDescriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{27, 0} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{28, 0} } type StakeLinking_Status int32 @@ -698,11 +836,11 @@ func (x StakeLinking_Status) String() string { } func (StakeLinking_Status) Descriptor() protoreflect.EnumDescriptor { - return file_vega_events_v1_events_proto_enumTypes[5].Descriptor() + return file_vega_events_v1_events_proto_enumTypes[7].Descriptor() } func (StakeLinking_Status) Type() protoreflect.EnumType { - return &file_vega_events_v1_events_proto_enumTypes[5] + return &file_vega_events_v1_events_proto_enumTypes[7] } func (x StakeLinking_Status) Number() protoreflect.EnumNumber { @@ -711,7 +849,7 @@ func (x StakeLinking_Status) Number() protoreflect.EnumNumber { // Deprecated: Use StakeLinking_Status.Descriptor instead. func (StakeLinking_Status) EnumDescriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{27, 1} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{28, 1} } type ERC20MultiSigSignerEvent_Type int32 @@ -747,11 +885,11 @@ func (x ERC20MultiSigSignerEvent_Type) String() string { } func (ERC20MultiSigSignerEvent_Type) Descriptor() protoreflect.EnumDescriptor { - return file_vega_events_v1_events_proto_enumTypes[6].Descriptor() + return file_vega_events_v1_events_proto_enumTypes[8].Descriptor() } func (ERC20MultiSigSignerEvent_Type) Type() protoreflect.EnumType { - return &file_vega_events_v1_events_proto_enumTypes[6] + return &file_vega_events_v1_events_proto_enumTypes[8] } func (x ERC20MultiSigSignerEvent_Type) Number() protoreflect.EnumNumber { @@ -760,7 +898,7 @@ func (x ERC20MultiSigSignerEvent_Type) Number() protoreflect.EnumNumber { // Deprecated: Use ERC20MultiSigSignerEvent_Type.Descriptor instead. func (ERC20MultiSigSignerEvent_Type) EnumDescriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{28, 0} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{29, 0} } // Time weighted notional position update for the current epoch. @@ -852,6 +990,117 @@ func (x *TimeWeightedNotionalPositionUpdated) GetTimeWeightedNotionalPosition() return "" } +type AMMPool struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Owner of the AMM. + PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + // Market ID that the AMM provides liquidity for. + MarketId string `protobuf:"bytes,2,opt,name=market_id,json=marketId,proto3" json:"market_id,omitempty"` + // ID of the AMM. + PoolId string `protobuf:"bytes,3,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` + // Party ID that the AMM operates as. + SubAccount string `protobuf:"bytes,4,opt,name=sub_account,json=subAccount,proto3" json:"sub_account,omitempty"` + // Amount committed to the AMM. + Commitment string `protobuf:"bytes,5,opt,name=commitment,proto3" json:"commitment,omitempty"` + // Liquidity parameters that define the size and range of the AMM's tradeable volume. + Parameters *AMMPool_ConcentratedLiquidityParameters `protobuf:"bytes,6,opt,name=parameters,proto3" json:"parameters,omitempty"` + // Current status of the AMM. + Status AMMPool_Status `protobuf:"varint,7,opt,name=status,proto3,enum=vega.events.v1.AMMPool_Status" json:"status,omitempty"` + // Reason for the AMM's current status. + StatusReason AMMPool_StatusReason `protobuf:"varint,8,opt,name=status_reason,json=statusReason,proto3,enum=vega.events.v1.AMMPool_StatusReason" json:"status_reason,omitempty"` +} + +func (x *AMMPool) Reset() { + *x = AMMPool{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_events_v1_events_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AMMPool) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AMMPool) ProtoMessage() {} + +func (x *AMMPool) ProtoReflect() protoreflect.Message { + mi := &file_vega_events_v1_events_proto_msgTypes[1] + 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 AMMPool.ProtoReflect.Descriptor instead. +func (*AMMPool) Descriptor() ([]byte, []int) { + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{1} +} + +func (x *AMMPool) GetPartyId() string { + if x != nil { + return x.PartyId + } + return "" +} + +func (x *AMMPool) GetMarketId() string { + if x != nil { + return x.MarketId + } + return "" +} + +func (x *AMMPool) GetPoolId() string { + if x != nil { + return x.PoolId + } + return "" +} + +func (x *AMMPool) GetSubAccount() string { + if x != nil { + return x.SubAccount + } + return "" +} + +func (x *AMMPool) GetCommitment() string { + if x != nil { + return x.Commitment + } + return "" +} + +func (x *AMMPool) GetParameters() *AMMPool_ConcentratedLiquidityParameters { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *AMMPool) GetStatus() AMMPool_Status { + if x != nil { + return x.Status + } + return AMMPool_STATUS_UNSPECIFIED +} + +func (x *AMMPool) GetStatusReason() AMMPool_StatusReason { + if x != nil { + return x.StatusReason + } + return AMMPool_STATUS_REASON_UNSPECIFIED +} + // Summary of the vesting and locked balances for an epoch type VestingBalancesSummary struct { state protoimpl.MessageState @@ -867,7 +1116,7 @@ type VestingBalancesSummary struct { func (x *VestingBalancesSummary) Reset() { *x = VestingBalancesSummary{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[1] + mi := &file_vega_events_v1_events_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -880,7 +1129,7 @@ func (x *VestingBalancesSummary) String() string { func (*VestingBalancesSummary) ProtoMessage() {} func (x *VestingBalancesSummary) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[1] + mi := &file_vega_events_v1_events_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -893,7 +1142,7 @@ func (x *VestingBalancesSummary) ProtoReflect() protoreflect.Message { // Deprecated: Use VestingBalancesSummary.ProtoReflect.Descriptor instead. func (*VestingBalancesSummary) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{1} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{2} } func (x *VestingBalancesSummary) GetEpochSeq() uint64 { @@ -927,7 +1176,7 @@ type PartyVestingSummary struct { func (x *PartyVestingSummary) Reset() { *x = PartyVestingSummary{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[2] + mi := &file_vega_events_v1_events_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -940,7 +1189,7 @@ func (x *PartyVestingSummary) String() string { func (*PartyVestingSummary) ProtoMessage() {} func (x *PartyVestingSummary) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[2] + mi := &file_vega_events_v1_events_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -953,7 +1202,7 @@ func (x *PartyVestingSummary) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyVestingSummary.ProtoReflect.Descriptor instead. func (*PartyVestingSummary) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{2} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{3} } func (x *PartyVestingSummary) GetParty() string { @@ -994,7 +1243,7 @@ type PartyLockedBalance struct { func (x *PartyLockedBalance) Reset() { *x = PartyLockedBalance{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[3] + mi := &file_vega_events_v1_events_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1007,7 +1256,7 @@ func (x *PartyLockedBalance) String() string { func (*PartyLockedBalance) ProtoMessage() {} func (x *PartyLockedBalance) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[3] + mi := &file_vega_events_v1_events_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1020,7 +1269,7 @@ func (x *PartyLockedBalance) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyLockedBalance.ProtoReflect.Descriptor instead. func (*PartyLockedBalance) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{3} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{4} } func (x *PartyLockedBalance) GetAsset() string { @@ -1059,7 +1308,7 @@ type PartyVestingBalance struct { func (x *PartyVestingBalance) Reset() { *x = PartyVestingBalance{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[4] + mi := &file_vega_events_v1_events_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1072,7 +1321,7 @@ func (x *PartyVestingBalance) String() string { func (*PartyVestingBalance) ProtoMessage() {} func (x *PartyVestingBalance) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[4] + mi := &file_vega_events_v1_events_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1085,7 +1334,7 @@ func (x *PartyVestingBalance) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyVestingBalance.ProtoReflect.Descriptor instead. func (*PartyVestingBalance) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{4} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{5} } func (x *PartyVestingBalance) GetAsset() string { @@ -1117,7 +1366,7 @@ type VolumeDiscountStatsUpdated struct { func (x *VolumeDiscountStatsUpdated) Reset() { *x = VolumeDiscountStatsUpdated{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[5] + mi := &file_vega_events_v1_events_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1130,7 +1379,7 @@ func (x *VolumeDiscountStatsUpdated) String() string { func (*VolumeDiscountStatsUpdated) ProtoMessage() {} func (x *VolumeDiscountStatsUpdated) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[5] + mi := &file_vega_events_v1_events_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1143,7 +1392,7 @@ func (x *VolumeDiscountStatsUpdated) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeDiscountStatsUpdated.ProtoReflect.Descriptor instead. func (*VolumeDiscountStatsUpdated) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{5} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{6} } func (x *VolumeDiscountStatsUpdated) GetAtEpoch() uint64 { @@ -1177,7 +1426,7 @@ type PartyVolumeDiscountStats struct { func (x *PartyVolumeDiscountStats) Reset() { *x = PartyVolumeDiscountStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[6] + mi := &file_vega_events_v1_events_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1190,7 +1439,7 @@ func (x *PartyVolumeDiscountStats) String() string { func (*PartyVolumeDiscountStats) ProtoMessage() {} func (x *PartyVolumeDiscountStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[6] + mi := &file_vega_events_v1_events_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1203,7 +1452,7 @@ func (x *PartyVolumeDiscountStats) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyVolumeDiscountStats.ProtoReflect.Descriptor instead. func (*PartyVolumeDiscountStats) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{6} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{7} } func (x *PartyVolumeDiscountStats) GetPartyId() string { @@ -1242,7 +1491,7 @@ type VestingStatsUpdated struct { func (x *VestingStatsUpdated) Reset() { *x = VestingStatsUpdated{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[7] + mi := &file_vega_events_v1_events_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1255,7 +1504,7 @@ func (x *VestingStatsUpdated) String() string { func (*VestingStatsUpdated) ProtoMessage() {} func (x *VestingStatsUpdated) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[7] + mi := &file_vega_events_v1_events_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1268,7 +1517,7 @@ func (x *VestingStatsUpdated) ProtoReflect() protoreflect.Message { // Deprecated: Use VestingStatsUpdated.ProtoReflect.Descriptor instead. func (*VestingStatsUpdated) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{7} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{8} } func (x *VestingStatsUpdated) GetAtEpoch() uint64 { @@ -1302,7 +1551,7 @@ type PartyVestingStats struct { func (x *PartyVestingStats) Reset() { *x = PartyVestingStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[8] + mi := &file_vega_events_v1_events_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1315,7 +1564,7 @@ func (x *PartyVestingStats) String() string { func (*PartyVestingStats) ProtoMessage() {} func (x *PartyVestingStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[8] + mi := &file_vega_events_v1_events_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1328,7 +1577,7 @@ func (x *PartyVestingStats) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyVestingStats.ProtoReflect.Descriptor instead. func (*PartyVestingStats) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{8} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{9} } func (x *PartyVestingStats) GetPartyId() string { @@ -1383,7 +1632,7 @@ type FeesStats struct { func (x *FeesStats) Reset() { *x = FeesStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[9] + mi := &file_vega_events_v1_events_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1396,7 +1645,7 @@ func (x *FeesStats) String() string { func (*FeesStats) ProtoMessage() {} func (x *FeesStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[9] + mi := &file_vega_events_v1_events_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1409,7 +1658,7 @@ func (x *FeesStats) ProtoReflect() protoreflect.Message { // Deprecated: Use FeesStats.ProtoReflect.Descriptor instead. func (*FeesStats) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{9} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{10} } func (x *FeesStats) GetMarket() string { @@ -1497,7 +1746,7 @@ type ReferrerRewardsGenerated struct { func (x *ReferrerRewardsGenerated) Reset() { *x = ReferrerRewardsGenerated{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[10] + mi := &file_vega_events_v1_events_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1510,7 +1759,7 @@ func (x *ReferrerRewardsGenerated) String() string { func (*ReferrerRewardsGenerated) ProtoMessage() {} func (x *ReferrerRewardsGenerated) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[10] + mi := &file_vega_events_v1_events_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1523,7 +1772,7 @@ func (x *ReferrerRewardsGenerated) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferrerRewardsGenerated.ProtoReflect.Descriptor instead. func (*ReferrerRewardsGenerated) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{10} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{11} } func (x *ReferrerRewardsGenerated) GetReferrer() string { @@ -1555,7 +1804,7 @@ type MakerFeesGenerated struct { func (x *MakerFeesGenerated) Reset() { *x = MakerFeesGenerated{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[11] + mi := &file_vega_events_v1_events_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1568,7 +1817,7 @@ func (x *MakerFeesGenerated) String() string { func (*MakerFeesGenerated) ProtoMessage() {} func (x *MakerFeesGenerated) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[11] + mi := &file_vega_events_v1_events_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1581,7 +1830,7 @@ func (x *MakerFeesGenerated) ProtoReflect() protoreflect.Message { // Deprecated: Use MakerFeesGenerated.ProtoReflect.Descriptor instead. func (*MakerFeesGenerated) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{11} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{12} } func (x *MakerFeesGenerated) GetTaker() string { @@ -1615,7 +1864,7 @@ type PartyAmount struct { func (x *PartyAmount) Reset() { *x = PartyAmount{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[12] + mi := &file_vega_events_v1_events_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1628,7 +1877,7 @@ func (x *PartyAmount) String() string { func (*PartyAmount) ProtoMessage() {} func (x *PartyAmount) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[12] + mi := &file_vega_events_v1_events_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1641,7 +1890,7 @@ func (x *PartyAmount) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyAmount.ProtoReflect.Descriptor instead. func (*PartyAmount) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{12} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{13} } func (x *PartyAmount) GetParty() string { @@ -1694,7 +1943,7 @@ type PartyActivityStreak struct { func (x *PartyActivityStreak) Reset() { *x = PartyActivityStreak{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[13] + mi := &file_vega_events_v1_events_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1707,7 +1956,7 @@ func (x *PartyActivityStreak) String() string { func (*PartyActivityStreak) ProtoMessage() {} func (x *PartyActivityStreak) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[13] + mi := &file_vega_events_v1_events_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1720,7 +1969,7 @@ func (x *PartyActivityStreak) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyActivityStreak.ProtoReflect.Descriptor instead. func (*PartyActivityStreak) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{13} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{14} } func (x *PartyActivityStreak) GetParty() string { @@ -1813,7 +2062,7 @@ type FundingPeriod struct { func (x *FundingPeriod) Reset() { *x = FundingPeriod{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[14] + mi := &file_vega_events_v1_events_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1826,7 +2075,7 @@ func (x *FundingPeriod) String() string { func (*FundingPeriod) ProtoMessage() {} func (x *FundingPeriod) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[14] + mi := &file_vega_events_v1_events_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1839,7 +2088,7 @@ func (x *FundingPeriod) ProtoReflect() protoreflect.Message { // Deprecated: Use FundingPeriod.ProtoReflect.Descriptor instead. func (*FundingPeriod) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{14} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{15} } func (x *FundingPeriod) GetMarketId() string { @@ -1913,7 +2162,7 @@ type FundingPayment struct { func (x *FundingPayment) Reset() { *x = FundingPayment{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[15] + mi := &file_vega_events_v1_events_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1926,7 +2175,7 @@ func (x *FundingPayment) String() string { func (*FundingPayment) ProtoMessage() {} func (x *FundingPayment) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[15] + mi := &file_vega_events_v1_events_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1939,7 +2188,7 @@ func (x *FundingPayment) ProtoReflect() protoreflect.Message { // Deprecated: Use FundingPayment.ProtoReflect.Descriptor instead. func (*FundingPayment) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{15} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{16} } func (x *FundingPayment) GetPartyId() string { @@ -1973,7 +2222,7 @@ type FundingPayments struct { func (x *FundingPayments) Reset() { *x = FundingPayments{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[16] + mi := &file_vega_events_v1_events_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1986,7 +2235,7 @@ func (x *FundingPayments) String() string { func (*FundingPayments) ProtoMessage() {} func (x *FundingPayments) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[16] + mi := &file_vega_events_v1_events_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1999,7 +2248,7 @@ func (x *FundingPayments) ProtoReflect() protoreflect.Message { // Deprecated: Use FundingPayments.ProtoReflect.Descriptor instead. func (*FundingPayments) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{16} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{17} } func (x *FundingPayments) GetMarketId() string { @@ -2046,7 +2295,7 @@ type FundingPeriodDataPoint struct { func (x *FundingPeriodDataPoint) Reset() { *x = FundingPeriodDataPoint{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[17] + mi := &file_vega_events_v1_events_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2059,7 +2308,7 @@ func (x *FundingPeriodDataPoint) String() string { func (*FundingPeriodDataPoint) ProtoMessage() {} func (x *FundingPeriodDataPoint) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[17] + mi := &file_vega_events_v1_events_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2072,7 +2321,7 @@ func (x *FundingPeriodDataPoint) ProtoReflect() protoreflect.Message { // Deprecated: Use FundingPeriodDataPoint.ProtoReflect.Descriptor instead. func (*FundingPeriodDataPoint) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{17} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{18} } func (x *FundingPeriodDataPoint) GetMarketId() string { @@ -2129,7 +2378,7 @@ type StopOrderEvent struct { func (x *StopOrderEvent) Reset() { *x = StopOrderEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[18] + mi := &file_vega_events_v1_events_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2142,7 +2391,7 @@ func (x *StopOrderEvent) String() string { func (*StopOrderEvent) ProtoMessage() {} func (x *StopOrderEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[18] + mi := &file_vega_events_v1_events_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2155,7 +2404,7 @@ func (x *StopOrderEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use StopOrderEvent.ProtoReflect.Descriptor instead. func (*StopOrderEvent) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{18} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{19} } func (x *StopOrderEvent) GetSubmission() *v1.OrderSubmission { @@ -2198,7 +2447,7 @@ type ERC20MultiSigSignerAdded struct { func (x *ERC20MultiSigSignerAdded) Reset() { *x = ERC20MultiSigSignerAdded{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[19] + mi := &file_vega_events_v1_events_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2211,7 +2460,7 @@ func (x *ERC20MultiSigSignerAdded) String() string { func (*ERC20MultiSigSignerAdded) ProtoMessage() {} func (x *ERC20MultiSigSignerAdded) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[19] + mi := &file_vega_events_v1_events_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2224,7 +2473,7 @@ func (x *ERC20MultiSigSignerAdded) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20MultiSigSignerAdded.ProtoReflect.Descriptor instead. func (*ERC20MultiSigSignerAdded) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{19} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{20} } func (x *ERC20MultiSigSignerAdded) GetSignatureId() string { @@ -2297,7 +2546,7 @@ type ERC20MultiSigSignerRemovedSubmitter struct { func (x *ERC20MultiSigSignerRemovedSubmitter) Reset() { *x = ERC20MultiSigSignerRemovedSubmitter{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[20] + mi := &file_vega_events_v1_events_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2310,7 +2559,7 @@ func (x *ERC20MultiSigSignerRemovedSubmitter) String() string { func (*ERC20MultiSigSignerRemovedSubmitter) ProtoMessage() {} func (x *ERC20MultiSigSignerRemovedSubmitter) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[20] + mi := &file_vega_events_v1_events_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2323,7 +2572,7 @@ func (x *ERC20MultiSigSignerRemovedSubmitter) ProtoReflect() protoreflect.Messag // Deprecated: Use ERC20MultiSigSignerRemovedSubmitter.ProtoReflect.Descriptor instead. func (*ERC20MultiSigSignerRemovedSubmitter) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{20} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{21} } func (x *ERC20MultiSigSignerRemovedSubmitter) GetSignatureId() string { @@ -2366,7 +2615,7 @@ type ERC20MultiSigSignerRemoved struct { func (x *ERC20MultiSigSignerRemoved) Reset() { *x = ERC20MultiSigSignerRemoved{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[21] + mi := &file_vega_events_v1_events_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2379,7 +2628,7 @@ func (x *ERC20MultiSigSignerRemoved) String() string { func (*ERC20MultiSigSignerRemoved) ProtoMessage() {} func (x *ERC20MultiSigSignerRemoved) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[21] + mi := &file_vega_events_v1_events_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2392,7 +2641,7 @@ func (x *ERC20MultiSigSignerRemoved) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20MultiSigSignerRemoved.ProtoReflect.Descriptor instead. func (*ERC20MultiSigSignerRemoved) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{21} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{22} } func (x *ERC20MultiSigSignerRemoved) GetSignatureSubmitters() []*ERC20MultiSigSignerRemovedSubmitter { @@ -2475,7 +2724,7 @@ type Transfer struct { func (x *Transfer) Reset() { *x = Transfer{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[22] + mi := &file_vega_events_v1_events_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2488,7 +2737,7 @@ func (x *Transfer) String() string { func (*Transfer) ProtoMessage() {} func (x *Transfer) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[22] + mi := &file_vega_events_v1_events_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2501,7 +2750,7 @@ func (x *Transfer) ProtoReflect() protoreflect.Message { // Deprecated: Use Transfer.ProtoReflect.Descriptor instead. func (*Transfer) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{22} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{23} } func (x *Transfer) GetId() string { @@ -2662,7 +2911,7 @@ type OneOffGovernanceTransfer struct { func (x *OneOffGovernanceTransfer) Reset() { *x = OneOffGovernanceTransfer{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[23] + mi := &file_vega_events_v1_events_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2675,7 +2924,7 @@ func (x *OneOffGovernanceTransfer) String() string { func (*OneOffGovernanceTransfer) ProtoMessage() {} func (x *OneOffGovernanceTransfer) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[23] + mi := &file_vega_events_v1_events_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2688,7 +2937,7 @@ func (x *OneOffGovernanceTransfer) ProtoReflect() protoreflect.Message { // Deprecated: Use OneOffGovernanceTransfer.ProtoReflect.Descriptor instead. func (*OneOffGovernanceTransfer) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{23} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{24} } func (x *OneOffGovernanceTransfer) GetDeliverOn() int64 { @@ -2709,7 +2958,7 @@ type OneOffTransfer struct { func (x *OneOffTransfer) Reset() { *x = OneOffTransfer{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[24] + mi := &file_vega_events_v1_events_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2722,7 +2971,7 @@ func (x *OneOffTransfer) String() string { func (*OneOffTransfer) ProtoMessage() {} func (x *OneOffTransfer) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[24] + mi := &file_vega_events_v1_events_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2735,7 +2984,7 @@ func (x *OneOffTransfer) ProtoReflect() protoreflect.Message { // Deprecated: Use OneOffTransfer.ProtoReflect.Descriptor instead. func (*OneOffTransfer) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{24} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{25} } func (x *OneOffTransfer) GetDeliverOn() int64 { @@ -2759,7 +3008,7 @@ type RecurringTransfer struct { func (x *RecurringTransfer) Reset() { *x = RecurringTransfer{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[25] + mi := &file_vega_events_v1_events_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2772,7 +3021,7 @@ func (x *RecurringTransfer) String() string { func (*RecurringTransfer) ProtoMessage() {} func (x *RecurringTransfer) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[25] + mi := &file_vega_events_v1_events_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2785,7 +3034,7 @@ func (x *RecurringTransfer) ProtoReflect() protoreflect.Message { // Deprecated: Use RecurringTransfer.ProtoReflect.Descriptor instead. func (*RecurringTransfer) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{25} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{26} } func (x *RecurringTransfer) GetStartEpoch() uint64 { @@ -2829,7 +3078,7 @@ type RecurringGovernanceTransfer struct { func (x *RecurringGovernanceTransfer) Reset() { *x = RecurringGovernanceTransfer{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[26] + mi := &file_vega_events_v1_events_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2842,7 +3091,7 @@ func (x *RecurringGovernanceTransfer) String() string { func (*RecurringGovernanceTransfer) ProtoMessage() {} func (x *RecurringGovernanceTransfer) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[26] + mi := &file_vega_events_v1_events_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2855,7 +3104,7 @@ func (x *RecurringGovernanceTransfer) ProtoReflect() protoreflect.Message { // Deprecated: Use RecurringGovernanceTransfer.ProtoReflect.Descriptor instead. func (*RecurringGovernanceTransfer) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{26} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{27} } func (x *RecurringGovernanceTransfer) GetStartEpoch() uint64 { @@ -2915,7 +3164,7 @@ type StakeLinking struct { func (x *StakeLinking) Reset() { *x = StakeLinking{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[27] + mi := &file_vega_events_v1_events_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2928,7 +3177,7 @@ func (x *StakeLinking) String() string { func (*StakeLinking) ProtoMessage() {} func (x *StakeLinking) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[27] + mi := &file_vega_events_v1_events_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2941,7 +3190,7 @@ func (x *StakeLinking) ProtoReflect() protoreflect.Message { // Deprecated: Use StakeLinking.ProtoReflect.Descriptor instead. func (*StakeLinking) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{27} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{28} } func (x *StakeLinking) GetId() string { @@ -3047,7 +3296,7 @@ type ERC20MultiSigSignerEvent struct { func (x *ERC20MultiSigSignerEvent) Reset() { *x = ERC20MultiSigSignerEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[28] + mi := &file_vega_events_v1_events_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3060,7 +3309,7 @@ func (x *ERC20MultiSigSignerEvent) String() string { func (*ERC20MultiSigSignerEvent) ProtoMessage() {} func (x *ERC20MultiSigSignerEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[28] + mi := &file_vega_events_v1_events_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3073,7 +3322,7 @@ func (x *ERC20MultiSigSignerEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20MultiSigSignerEvent.ProtoReflect.Descriptor instead. func (*ERC20MultiSigSignerEvent) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{28} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{29} } func (x *ERC20MultiSigSignerEvent) GetId() string { @@ -3157,7 +3406,7 @@ type ERC20MultiSigThresholdSetEvent struct { func (x *ERC20MultiSigThresholdSetEvent) Reset() { *x = ERC20MultiSigThresholdSetEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[29] + mi := &file_vega_events_v1_events_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3170,7 +3419,7 @@ func (x *ERC20MultiSigThresholdSetEvent) String() string { func (*ERC20MultiSigThresholdSetEvent) ProtoMessage() {} func (x *ERC20MultiSigThresholdSetEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[29] + mi := &file_vega_events_v1_events_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3183,7 +3432,7 @@ func (x *ERC20MultiSigThresholdSetEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20MultiSigThresholdSetEvent.ProtoReflect.Descriptor instead. func (*ERC20MultiSigThresholdSetEvent) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{29} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{30} } func (x *ERC20MultiSigThresholdSetEvent) GetId() string { @@ -3255,7 +3504,7 @@ type CheckpointEvent struct { func (x *CheckpointEvent) Reset() { *x = CheckpointEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[30] + mi := &file_vega_events_v1_events_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3268,7 +3517,7 @@ func (x *CheckpointEvent) String() string { func (*CheckpointEvent) ProtoMessage() {} func (x *CheckpointEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[30] + mi := &file_vega_events_v1_events_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3281,7 +3530,7 @@ func (x *CheckpointEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckpointEvent.ProtoReflect.Descriptor instead. func (*CheckpointEvent) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{30} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{31} } func (x *CheckpointEvent) GetHash() string { @@ -3316,7 +3565,7 @@ type StreamStartEvent struct { func (x *StreamStartEvent) Reset() { *x = StreamStartEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[31] + mi := &file_vega_events_v1_events_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3329,7 +3578,7 @@ func (x *StreamStartEvent) String() string { func (*StreamStartEvent) ProtoMessage() {} func (x *StreamStartEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[31] + mi := &file_vega_events_v1_events_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3342,7 +3591,7 @@ func (x *StreamStartEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamStartEvent.ProtoReflect.Descriptor instead. func (*StreamStartEvent) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{31} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{32} } func (x *StreamStartEvent) GetChainId() string { @@ -3372,7 +3621,7 @@ type RewardPayoutEvent struct { func (x *RewardPayoutEvent) Reset() { *x = RewardPayoutEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[32] + mi := &file_vega_events_v1_events_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3385,7 +3634,7 @@ func (x *RewardPayoutEvent) String() string { func (*RewardPayoutEvent) ProtoMessage() {} func (x *RewardPayoutEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[32] + mi := &file_vega_events_v1_events_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3398,7 +3647,7 @@ func (x *RewardPayoutEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use RewardPayoutEvent.ProtoReflect.Descriptor instead. func (*RewardPayoutEvent) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{32} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{33} } func (x *RewardPayoutEvent) GetParty() string { @@ -3490,7 +3739,7 @@ type ValidatorScoreEvent struct { func (x *ValidatorScoreEvent) Reset() { *x = ValidatorScoreEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[33] + mi := &file_vega_events_v1_events_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3503,7 +3752,7 @@ func (x *ValidatorScoreEvent) String() string { func (*ValidatorScoreEvent) ProtoMessage() {} func (x *ValidatorScoreEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[33] + mi := &file_vega_events_v1_events_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3516,7 +3765,7 @@ func (x *ValidatorScoreEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatorScoreEvent.ProtoReflect.Descriptor instead. func (*ValidatorScoreEvent) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{33} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{34} } func (x *ValidatorScoreEvent) GetNodeId() string { @@ -3590,7 +3839,7 @@ type DelegationBalanceEvent struct { func (x *DelegationBalanceEvent) Reset() { *x = DelegationBalanceEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[34] + mi := &file_vega_events_v1_events_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3603,7 +3852,7 @@ func (x *DelegationBalanceEvent) String() string { func (*DelegationBalanceEvent) ProtoMessage() {} func (x *DelegationBalanceEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[34] + mi := &file_vega_events_v1_events_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3616,7 +3865,7 @@ func (x *DelegationBalanceEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use DelegationBalanceEvent.ProtoReflect.Descriptor instead. func (*DelegationBalanceEvent) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{34} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{35} } func (x *DelegationBalanceEvent) GetParty() string { @@ -3663,7 +3912,7 @@ type MarketEvent struct { func (x *MarketEvent) Reset() { *x = MarketEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[35] + mi := &file_vega_events_v1_events_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3676,7 +3925,7 @@ func (x *MarketEvent) String() string { func (*MarketEvent) ProtoMessage() {} func (x *MarketEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[35] + mi := &file_vega_events_v1_events_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3689,7 +3938,7 @@ func (x *MarketEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use MarketEvent.ProtoReflect.Descriptor instead. func (*MarketEvent) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{35} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{36} } func (x *MarketEvent) GetMarketId() string { @@ -3724,7 +3973,7 @@ type TransferFees struct { func (x *TransferFees) Reset() { *x = TransferFees{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[36] + mi := &file_vega_events_v1_events_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3737,7 +3986,7 @@ func (x *TransferFees) String() string { func (*TransferFees) ProtoMessage() {} func (x *TransferFees) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[36] + mi := &file_vega_events_v1_events_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3750,7 +3999,7 @@ func (x *TransferFees) ProtoReflect() protoreflect.Message { // Deprecated: Use TransferFees.ProtoReflect.Descriptor instead. func (*TransferFees) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{36} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{37} } func (x *TransferFees) GetTransferId() string { @@ -3799,7 +4048,7 @@ type TransferFeesDiscount struct { func (x *TransferFeesDiscount) Reset() { *x = TransferFeesDiscount{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[37] + mi := &file_vega_events_v1_events_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3812,7 +4061,7 @@ func (x *TransferFeesDiscount) String() string { func (*TransferFeesDiscount) ProtoMessage() {} func (x *TransferFeesDiscount) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[37] + mi := &file_vega_events_v1_events_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3825,7 +4074,7 @@ func (x *TransferFeesDiscount) ProtoReflect() protoreflect.Message { // Deprecated: Use TransferFeesDiscount.ProtoReflect.Descriptor instead. func (*TransferFeesDiscount) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{37} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{38} } func (x *TransferFeesDiscount) GetParty() string { @@ -3898,6 +4147,9 @@ type TransactionResult struct { // *TransactionResult_JoinTeam // *TransactionResult_BatchProposal // *TransactionResult_UpdatePartyProfile + // *TransactionResult_SubmitAmm + // *TransactionResult_AmendAmm + // *TransactionResult_CancelAmm Transaction isTransactionResult_Transaction `protobuf_oneof:"transaction"` // extra details about the transaction processing // @@ -3911,7 +4163,7 @@ type TransactionResult struct { func (x *TransactionResult) Reset() { *x = TransactionResult{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[38] + mi := &file_vega_events_v1_events_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3924,7 +4176,7 @@ func (x *TransactionResult) String() string { func (*TransactionResult) ProtoMessage() {} func (x *TransactionResult) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[38] + mi := &file_vega_events_v1_events_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3937,7 +4189,7 @@ func (x *TransactionResult) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionResult.ProtoReflect.Descriptor instead. func (*TransactionResult) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{38} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{39} } func (x *TransactionResult) GetPartyId() string { @@ -4171,6 +4423,27 @@ func (x *TransactionResult) GetUpdatePartyProfile() *v1.UpdatePartyProfile { return nil } +func (x *TransactionResult) GetSubmitAmm() *v1.SubmitAMM { + if x, ok := x.GetTransaction().(*TransactionResult_SubmitAmm); ok { + return x.SubmitAmm + } + return nil +} + +func (x *TransactionResult) GetAmendAmm() *v1.AmendAMM { + if x, ok := x.GetTransaction().(*TransactionResult_AmendAmm); ok { + return x.AmendAmm + } + return nil +} + +func (x *TransactionResult) GetCancelAmm() *v1.CancelAMM { + if x, ok := x.GetTransaction().(*TransactionResult_CancelAmm); ok { + return x.CancelAmm + } + return nil +} + func (m *TransactionResult) GetExtra() isTransactionResult_Extra { if m != nil { return m.Extra @@ -4312,6 +4585,18 @@ type TransactionResult_UpdatePartyProfile struct { UpdatePartyProfile *v1.UpdatePartyProfile `protobuf:"bytes,130,opt,name=update_party_profile,json=updatePartyProfile,proto3,oneof"` } +type TransactionResult_SubmitAmm struct { + SubmitAmm *v1.SubmitAMM `protobuf:"bytes,131,opt,name=submit_amm,json=submitAmm,proto3,oneof"` +} + +type TransactionResult_AmendAmm struct { + AmendAmm *v1.AmendAMM `protobuf:"bytes,132,opt,name=amend_amm,json=amendAmm,proto3,oneof"` +} + +type TransactionResult_CancelAmm struct { + CancelAmm *v1.CancelAMM `protobuf:"bytes,133,opt,name=cancel_amm,json=cancelAmm,proto3,oneof"` +} + func (*TransactionResult_OrderSubmission) isTransactionResult_Transaction() {} func (*TransactionResult_OrderAmendment) isTransactionResult_Transaction() {} @@ -4370,6 +4655,12 @@ func (*TransactionResult_BatchProposal) isTransactionResult_Transaction() {} func (*TransactionResult_UpdatePartyProfile) isTransactionResult_Transaction() {} +func (*TransactionResult_SubmitAmm) isTransactionResult_Transaction() {} + +func (*TransactionResult_AmendAmm) isTransactionResult_Transaction() {} + +func (*TransactionResult_CancelAmm) isTransactionResult_Transaction() {} + type isTransactionResult_Extra interface { isTransactionResult_Extra() } @@ -4423,7 +4714,7 @@ type TxErrorEvent struct { func (x *TxErrorEvent) Reset() { *x = TxErrorEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[39] + mi := &file_vega_events_v1_events_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4436,7 +4727,7 @@ func (x *TxErrorEvent) String() string { func (*TxErrorEvent) ProtoMessage() {} func (x *TxErrorEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[39] + mi := &file_vega_events_v1_events_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4449,7 +4740,7 @@ func (x *TxErrorEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use TxErrorEvent.ProtoReflect.Descriptor instead. func (*TxErrorEvent) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{39} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{40} } func (x *TxErrorEvent) GetPartyId() string { @@ -4724,7 +5015,7 @@ type TimeUpdate struct { func (x *TimeUpdate) Reset() { *x = TimeUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[40] + mi := &file_vega_events_v1_events_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4737,7 +5028,7 @@ func (x *TimeUpdate) String() string { func (*TimeUpdate) ProtoMessage() {} func (x *TimeUpdate) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[40] + mi := &file_vega_events_v1_events_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4750,7 +5041,7 @@ func (x *TimeUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use TimeUpdate.ProtoReflect.Descriptor instead. func (*TimeUpdate) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{40} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{41} } func (x *TimeUpdate) GetTimestamp() int64 { @@ -4781,7 +5072,7 @@ type EpochEvent struct { func (x *EpochEvent) Reset() { *x = EpochEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[41] + mi := &file_vega_events_v1_events_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4794,7 +5085,7 @@ func (x *EpochEvent) String() string { func (*EpochEvent) ProtoMessage() {} func (x *EpochEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[41] + mi := &file_vega_events_v1_events_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4807,7 +5098,7 @@ func (x *EpochEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use EpochEvent.ProtoReflect.Descriptor instead. func (*EpochEvent) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{41} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{42} } func (x *EpochEvent) GetSeq() uint64 { @@ -4858,7 +5149,7 @@ type LedgerMovements struct { func (x *LedgerMovements) Reset() { *x = LedgerMovements{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[42] + mi := &file_vega_events_v1_events_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4871,7 +5162,7 @@ func (x *LedgerMovements) String() string { func (*LedgerMovements) ProtoMessage() {} func (x *LedgerMovements) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[42] + mi := &file_vega_events_v1_events_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4884,7 +5175,7 @@ func (x *LedgerMovements) ProtoReflect() protoreflect.Message { // Deprecated: Use LedgerMovements.ProtoReflect.Descriptor instead. func (*LedgerMovements) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{42} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{43} } func (x *LedgerMovements) GetLedgerMovements() []*vega.LedgerMovement { @@ -4913,7 +5204,7 @@ type PositionResolution struct { func (x *PositionResolution) Reset() { *x = PositionResolution{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[43] + mi := &file_vega_events_v1_events_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4926,7 +5217,7 @@ func (x *PositionResolution) String() string { func (*PositionResolution) ProtoMessage() {} func (x *PositionResolution) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[43] + mi := &file_vega_events_v1_events_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4939,7 +5230,7 @@ func (x *PositionResolution) ProtoReflect() protoreflect.Message { // Deprecated: Use PositionResolution.ProtoReflect.Descriptor instead. func (*PositionResolution) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{43} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{44} } func (x *PositionResolution) GetMarketId() string { @@ -4987,7 +5278,7 @@ type LossSocialization struct { func (x *LossSocialization) Reset() { *x = LossSocialization{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[44] + mi := &file_vega_events_v1_events_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5000,7 +5291,7 @@ func (x *LossSocialization) String() string { func (*LossSocialization) ProtoMessage() {} func (x *LossSocialization) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[44] + mi := &file_vega_events_v1_events_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5013,7 +5304,7 @@ func (x *LossSocialization) ProtoReflect() protoreflect.Message { // Deprecated: Use LossSocialization.ProtoReflect.Descriptor instead. func (*LossSocialization) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{44} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{45} } func (x *LossSocialization) GetMarketId() string { @@ -5054,7 +5345,7 @@ type TradeSettlement struct { func (x *TradeSettlement) Reset() { *x = TradeSettlement{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[45] + mi := &file_vega_events_v1_events_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5067,7 +5358,7 @@ func (x *TradeSettlement) String() string { func (*TradeSettlement) ProtoMessage() {} func (x *TradeSettlement) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[45] + mi := &file_vega_events_v1_events_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5080,7 +5371,7 @@ func (x *TradeSettlement) ProtoReflect() protoreflect.Message { // Deprecated: Use TradeSettlement.ProtoReflect.Descriptor instead. func (*TradeSettlement) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{45} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{46} } func (x *TradeSettlement) GetSize() int64 { @@ -5125,7 +5416,7 @@ type SettlePosition struct { func (x *SettlePosition) Reset() { *x = SettlePosition{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[46] + mi := &file_vega_events_v1_events_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5138,7 +5429,7 @@ func (x *SettlePosition) String() string { func (*SettlePosition) ProtoMessage() {} func (x *SettlePosition) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[46] + mi := &file_vega_events_v1_events_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5151,7 +5442,7 @@ func (x *SettlePosition) ProtoReflect() protoreflect.Message { // Deprecated: Use SettlePosition.ProtoReflect.Descriptor instead. func (*SettlePosition) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{46} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{47} } func (x *SettlePosition) GetMarketId() string { @@ -5207,7 +5498,7 @@ type SettleMarket struct { func (x *SettleMarket) Reset() { *x = SettleMarket{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[47] + mi := &file_vega_events_v1_events_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5220,7 +5511,7 @@ func (x *SettleMarket) String() string { func (*SettleMarket) ProtoMessage() {} func (x *SettleMarket) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[47] + mi := &file_vega_events_v1_events_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5233,7 +5524,7 @@ func (x *SettleMarket) ProtoReflect() protoreflect.Message { // Deprecated: Use SettleMarket.ProtoReflect.Descriptor instead. func (*SettleMarket) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{47} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{48} } func (x *SettleMarket) GetMarketId() string { @@ -5280,7 +5571,7 @@ type PositionStateEvent struct { func (x *PositionStateEvent) Reset() { *x = PositionStateEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[48] + mi := &file_vega_events_v1_events_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5293,7 +5584,7 @@ func (x *PositionStateEvent) String() string { func (*PositionStateEvent) ProtoMessage() {} func (x *PositionStateEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[48] + mi := &file_vega_events_v1_events_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5306,7 +5597,7 @@ func (x *PositionStateEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use PositionStateEvent.ProtoReflect.Descriptor instead. func (*PositionStateEvent) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{48} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{49} } func (x *PositionStateEvent) GetPartyId() string { @@ -5379,7 +5670,7 @@ type SettleDistressed struct { func (x *SettleDistressed) Reset() { *x = SettleDistressed{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[49] + mi := &file_vega_events_v1_events_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5392,7 +5683,7 @@ func (x *SettleDistressed) String() string { func (*SettleDistressed) ProtoMessage() {} func (x *SettleDistressed) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[49] + mi := &file_vega_events_v1_events_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5405,7 +5696,7 @@ func (x *SettleDistressed) ProtoReflect() protoreflect.Message { // Deprecated: Use SettleDistressed.ProtoReflect.Descriptor instead. func (*SettleDistressed) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{49} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{50} } func (x *SettleDistressed) GetMarketId() string { @@ -5452,7 +5743,7 @@ type DistressedOrders struct { func (x *DistressedOrders) Reset() { *x = DistressedOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[50] + mi := &file_vega_events_v1_events_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5465,7 +5756,7 @@ func (x *DistressedOrders) String() string { func (*DistressedOrders) ProtoMessage() {} func (x *DistressedOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[50] + mi := &file_vega_events_v1_events_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5478,7 +5769,7 @@ func (x *DistressedOrders) ProtoReflect() protoreflect.Message { // Deprecated: Use DistressedOrders.ProtoReflect.Descriptor instead. func (*DistressedOrders) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{50} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{51} } func (x *DistressedOrders) GetMarketId() string { @@ -5515,7 +5806,7 @@ type DistressedPositions struct { func (x *DistressedPositions) Reset() { *x = DistressedPositions{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[51] + mi := &file_vega_events_v1_events_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5528,7 +5819,7 @@ func (x *DistressedPositions) String() string { func (*DistressedPositions) ProtoMessage() {} func (x *DistressedPositions) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[51] + mi := &file_vega_events_v1_events_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5541,7 +5832,7 @@ func (x *DistressedPositions) ProtoReflect() protoreflect.Message { // Deprecated: Use DistressedPositions.ProtoReflect.Descriptor instead. func (*DistressedPositions) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{51} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{52} } func (x *DistressedPositions) GetMarketId() string { @@ -5580,7 +5871,7 @@ type MarketTick struct { func (x *MarketTick) Reset() { *x = MarketTick{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[52] + mi := &file_vega_events_v1_events_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5593,7 +5884,7 @@ func (x *MarketTick) String() string { func (*MarketTick) ProtoMessage() {} func (x *MarketTick) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[52] + mi := &file_vega_events_v1_events_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5606,7 +5897,7 @@ func (x *MarketTick) ProtoReflect() protoreflect.Message { // Deprecated: Use MarketTick.ProtoReflect.Descriptor instead. func (*MarketTick) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{52} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{53} } func (x *MarketTick) GetId() string { @@ -5649,7 +5940,7 @@ type AuctionEvent struct { func (x *AuctionEvent) Reset() { *x = AuctionEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[53] + mi := &file_vega_events_v1_events_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5662,7 +5953,7 @@ func (x *AuctionEvent) String() string { func (*AuctionEvent) ProtoMessage() {} func (x *AuctionEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[53] + mi := &file_vega_events_v1_events_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5675,7 +5966,7 @@ func (x *AuctionEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AuctionEvent.ProtoReflect.Descriptor instead. func (*AuctionEvent) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{53} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{54} } func (x *AuctionEvent) GetMarketId() string { @@ -5764,7 +6055,7 @@ type ValidatorUpdate struct { func (x *ValidatorUpdate) Reset() { *x = ValidatorUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[54] + mi := &file_vega_events_v1_events_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5777,7 +6068,7 @@ func (x *ValidatorUpdate) String() string { func (*ValidatorUpdate) ProtoMessage() {} func (x *ValidatorUpdate) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[54] + mi := &file_vega_events_v1_events_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5790,7 +6081,7 @@ func (x *ValidatorUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatorUpdate.ProtoReflect.Descriptor instead. func (*ValidatorUpdate) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{54} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{55} } func (x *ValidatorUpdate) GetNodeId() string { @@ -5910,7 +6201,7 @@ type ValidatorRankingEvent struct { func (x *ValidatorRankingEvent) Reset() { *x = ValidatorRankingEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[55] + mi := &file_vega_events_v1_events_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5923,7 +6214,7 @@ func (x *ValidatorRankingEvent) String() string { func (*ValidatorRankingEvent) ProtoMessage() {} func (x *ValidatorRankingEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[55] + mi := &file_vega_events_v1_events_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5936,7 +6227,7 @@ func (x *ValidatorRankingEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatorRankingEvent.ProtoReflect.Descriptor instead. func (*ValidatorRankingEvent) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{55} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{56} } func (x *ValidatorRankingEvent) GetNodeId() string { @@ -6014,7 +6305,7 @@ type KeyRotation struct { func (x *KeyRotation) Reset() { *x = KeyRotation{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[56] + mi := &file_vega_events_v1_events_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6027,7 +6318,7 @@ func (x *KeyRotation) String() string { func (*KeyRotation) ProtoMessage() {} func (x *KeyRotation) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[56] + mi := &file_vega_events_v1_events_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6040,7 +6331,7 @@ func (x *KeyRotation) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyRotation.ProtoReflect.Descriptor instead. func (*KeyRotation) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{56} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{57} } func (x *KeyRotation) GetNodeId() string { @@ -6090,7 +6381,7 @@ type EthereumKeyRotation struct { func (x *EthereumKeyRotation) Reset() { *x = EthereumKeyRotation{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[57] + mi := &file_vega_events_v1_events_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6103,7 +6394,7 @@ func (x *EthereumKeyRotation) String() string { func (*EthereumKeyRotation) ProtoMessage() {} func (x *EthereumKeyRotation) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[57] + mi := &file_vega_events_v1_events_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6116,7 +6407,7 @@ func (x *EthereumKeyRotation) ProtoReflect() protoreflect.Message { // Deprecated: Use EthereumKeyRotation.ProtoReflect.Descriptor instead. func (*EthereumKeyRotation) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{57} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{58} } func (x *EthereumKeyRotation) GetNodeId() string { @@ -6165,7 +6456,7 @@ type ProtocolUpgradeEvent struct { func (x *ProtocolUpgradeEvent) Reset() { *x = ProtocolUpgradeEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[58] + mi := &file_vega_events_v1_events_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6178,7 +6469,7 @@ func (x *ProtocolUpgradeEvent) String() string { func (*ProtocolUpgradeEvent) ProtoMessage() {} func (x *ProtocolUpgradeEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[58] + mi := &file_vega_events_v1_events_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6191,7 +6482,7 @@ func (x *ProtocolUpgradeEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ProtocolUpgradeEvent.ProtoReflect.Descriptor instead. func (*ProtocolUpgradeEvent) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{58} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{59} } func (x *ProtocolUpgradeEvent) GetUpgradeBlockHeight() uint64 { @@ -6236,7 +6527,7 @@ type StateVar struct { func (x *StateVar) Reset() { *x = StateVar{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[59] + mi := &file_vega_events_v1_events_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6249,7 +6540,7 @@ func (x *StateVar) String() string { func (*StateVar) ProtoMessage() {} func (x *StateVar) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[59] + mi := &file_vega_events_v1_events_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6262,7 +6553,7 @@ func (x *StateVar) ProtoReflect() protoreflect.Message { // Deprecated: Use StateVar.ProtoReflect.Descriptor instead. func (*StateVar) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{59} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{60} } func (x *StateVar) GetId() string { @@ -6300,7 +6591,7 @@ type BeginBlock struct { func (x *BeginBlock) Reset() { *x = BeginBlock{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[60] + mi := &file_vega_events_v1_events_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6313,7 +6604,7 @@ func (x *BeginBlock) String() string { func (*BeginBlock) ProtoMessage() {} func (x *BeginBlock) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[60] + mi := &file_vega_events_v1_events_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6326,7 +6617,7 @@ func (x *BeginBlock) ProtoReflect() protoreflect.Message { // Deprecated: Use BeginBlock.ProtoReflect.Descriptor instead. func (*BeginBlock) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{60} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{61} } func (x *BeginBlock) GetHeight() uint64 { @@ -6362,7 +6653,7 @@ type EndBlock struct { func (x *EndBlock) Reset() { *x = EndBlock{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[61] + mi := &file_vega_events_v1_events_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6375,7 +6666,7 @@ func (x *EndBlock) String() string { func (*EndBlock) ProtoMessage() {} func (x *EndBlock) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[61] + mi := &file_vega_events_v1_events_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6388,7 +6679,7 @@ func (x *EndBlock) ProtoReflect() protoreflect.Message { // Deprecated: Use EndBlock.ProtoReflect.Descriptor instead. func (*EndBlock) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{61} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{62} } func (x *EndBlock) GetHeight() uint64 { @@ -6410,7 +6701,7 @@ type ProtocolUpgradeStarted struct { func (x *ProtocolUpgradeStarted) Reset() { *x = ProtocolUpgradeStarted{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[62] + mi := &file_vega_events_v1_events_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6423,7 +6714,7 @@ func (x *ProtocolUpgradeStarted) String() string { func (*ProtocolUpgradeStarted) ProtoMessage() {} func (x *ProtocolUpgradeStarted) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[62] + mi := &file_vega_events_v1_events_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6436,7 +6727,7 @@ func (x *ProtocolUpgradeStarted) ProtoReflect() protoreflect.Message { // Deprecated: Use ProtocolUpgradeStarted.ProtoReflect.Descriptor instead. func (*ProtocolUpgradeStarted) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{62} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{63} } func (x *ProtocolUpgradeStarted) GetLastBlockHeight() uint64 { @@ -6458,7 +6749,7 @@ type ProtocolUpgradeDataNodeReady struct { func (x *ProtocolUpgradeDataNodeReady) Reset() { *x = ProtocolUpgradeDataNodeReady{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[63] + mi := &file_vega_events_v1_events_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6471,7 +6762,7 @@ func (x *ProtocolUpgradeDataNodeReady) String() string { func (*ProtocolUpgradeDataNodeReady) ProtoMessage() {} func (x *ProtocolUpgradeDataNodeReady) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[63] + mi := &file_vega_events_v1_events_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6484,7 +6775,7 @@ func (x *ProtocolUpgradeDataNodeReady) ProtoReflect() protoreflect.Message { // Deprecated: Use ProtocolUpgradeDataNodeReady.ProtoReflect.Descriptor instead. func (*ProtocolUpgradeDataNodeReady) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{63} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{64} } func (x *ProtocolUpgradeDataNodeReady) GetLastBlockHeight() uint64 { @@ -6513,7 +6804,7 @@ type CoreSnapshotData struct { func (x *CoreSnapshotData) Reset() { *x = CoreSnapshotData{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[64] + mi := &file_vega_events_v1_events_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6526,7 +6817,7 @@ func (x *CoreSnapshotData) String() string { func (*CoreSnapshotData) ProtoMessage() {} func (x *CoreSnapshotData) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[64] + mi := &file_vega_events_v1_events_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6539,7 +6830,7 @@ func (x *CoreSnapshotData) ProtoReflect() protoreflect.Message { // Deprecated: Use CoreSnapshotData.ProtoReflect.Descriptor instead. func (*CoreSnapshotData) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{64} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{65} } func (x *CoreSnapshotData) GetBlockHeight() uint64 { @@ -6584,7 +6875,7 @@ type ExpiredOrders struct { func (x *ExpiredOrders) Reset() { *x = ExpiredOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[65] + mi := &file_vega_events_v1_events_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6597,7 +6888,7 @@ func (x *ExpiredOrders) String() string { func (*ExpiredOrders) ProtoMessage() {} func (x *ExpiredOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[65] + mi := &file_vega_events_v1_events_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6610,7 +6901,7 @@ func (x *ExpiredOrders) ProtoReflect() protoreflect.Message { // Deprecated: Use ExpiredOrders.ProtoReflect.Descriptor instead. func (*ExpiredOrders) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{65} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{66} } func (x *ExpiredOrders) GetMarketId() string { @@ -6643,7 +6934,7 @@ type CancelledOrders struct { func (x *CancelledOrders) Reset() { *x = CancelledOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[66] + mi := &file_vega_events_v1_events_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6656,7 +6947,7 @@ func (x *CancelledOrders) String() string { func (*CancelledOrders) ProtoMessage() {} func (x *CancelledOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[66] + mi := &file_vega_events_v1_events_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6669,7 +6960,7 @@ func (x *CancelledOrders) ProtoReflect() protoreflect.Message { // Deprecated: Use CancelledOrders.ProtoReflect.Descriptor instead. func (*CancelledOrders) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{66} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{67} } func (x *CancelledOrders) GetMarketId() string { @@ -6721,7 +7012,7 @@ type TeamCreated struct { func (x *TeamCreated) Reset() { *x = TeamCreated{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[67] + mi := &file_vega_events_v1_events_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6734,7 +7025,7 @@ func (x *TeamCreated) String() string { func (*TeamCreated) ProtoMessage() {} func (x *TeamCreated) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[67] + mi := &file_vega_events_v1_events_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6747,7 +7038,7 @@ func (x *TeamCreated) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamCreated.ProtoReflect.Descriptor instead. func (*TeamCreated) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{67} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{68} } func (x *TeamCreated) GetTeamId() string { @@ -6835,7 +7126,7 @@ type TeamUpdated struct { func (x *TeamUpdated) Reset() { *x = TeamUpdated{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[68] + mi := &file_vega_events_v1_events_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6848,7 +7139,7 @@ func (x *TeamUpdated) String() string { func (*TeamUpdated) ProtoMessage() {} func (x *TeamUpdated) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[68] + mi := &file_vega_events_v1_events_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6861,7 +7152,7 @@ func (x *TeamUpdated) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamUpdated.ProtoReflect.Descriptor instead. func (*TeamUpdated) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{68} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{69} } func (x *TeamUpdated) GetTeamId() string { @@ -6927,7 +7218,7 @@ type RefereeSwitchedTeam struct { func (x *RefereeSwitchedTeam) Reset() { *x = RefereeSwitchedTeam{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[69] + mi := &file_vega_events_v1_events_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6940,7 +7231,7 @@ func (x *RefereeSwitchedTeam) String() string { func (*RefereeSwitchedTeam) ProtoMessage() {} func (x *RefereeSwitchedTeam) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[69] + mi := &file_vega_events_v1_events_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6953,7 +7244,7 @@ func (x *RefereeSwitchedTeam) ProtoReflect() protoreflect.Message { // Deprecated: Use RefereeSwitchedTeam.ProtoReflect.Descriptor instead. func (*RefereeSwitchedTeam) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{69} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{70} } func (x *RefereeSwitchedTeam) GetFromTeamId() string { @@ -7009,7 +7300,7 @@ type RefereeJoinedTeam struct { func (x *RefereeJoinedTeam) Reset() { *x = RefereeJoinedTeam{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[70] + mi := &file_vega_events_v1_events_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7022,7 +7313,7 @@ func (x *RefereeJoinedTeam) String() string { func (*RefereeJoinedTeam) ProtoMessage() {} func (x *RefereeJoinedTeam) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[70] + mi := &file_vega_events_v1_events_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7035,7 +7326,7 @@ func (x *RefereeJoinedTeam) ProtoReflect() protoreflect.Message { // Deprecated: Use RefereeJoinedTeam.ProtoReflect.Descriptor instead. func (*RefereeJoinedTeam) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{70} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{71} } func (x *RefereeJoinedTeam) GetTeamId() string { @@ -7084,7 +7375,7 @@ type ReferralSetCreated struct { func (x *ReferralSetCreated) Reset() { *x = ReferralSetCreated{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[71] + mi := &file_vega_events_v1_events_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7097,7 +7388,7 @@ func (x *ReferralSetCreated) String() string { func (*ReferralSetCreated) ProtoMessage() {} func (x *ReferralSetCreated) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[71] + mi := &file_vega_events_v1_events_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7110,7 +7401,7 @@ func (x *ReferralSetCreated) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralSetCreated.ProtoReflect.Descriptor instead. func (*ReferralSetCreated) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{71} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{72} } func (x *ReferralSetCreated) GetSetId() string { @@ -7170,7 +7461,7 @@ type ReferralSetStatsUpdated struct { func (x *ReferralSetStatsUpdated) Reset() { *x = ReferralSetStatsUpdated{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[72] + mi := &file_vega_events_v1_events_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7183,7 +7474,7 @@ func (x *ReferralSetStatsUpdated) String() string { func (*ReferralSetStatsUpdated) ProtoMessage() {} func (x *ReferralSetStatsUpdated) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[72] + mi := &file_vega_events_v1_events_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7196,7 +7487,7 @@ func (x *ReferralSetStatsUpdated) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralSetStatsUpdated.ProtoReflect.Descriptor instead. func (*ReferralSetStatsUpdated) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{72} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{73} } func (x *ReferralSetStatsUpdated) GetSetId() string { @@ -7278,7 +7569,7 @@ type RefereeStats struct { func (x *RefereeStats) Reset() { *x = RefereeStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[73] + mi := &file_vega_events_v1_events_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7291,7 +7582,7 @@ func (x *RefereeStats) String() string { func (*RefereeStats) ProtoMessage() {} func (x *RefereeStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[73] + mi := &file_vega_events_v1_events_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7304,7 +7595,7 @@ func (x *RefereeStats) ProtoReflect() protoreflect.Message { // Deprecated: Use RefereeStats.ProtoReflect.Descriptor instead. func (*RefereeStats) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{73} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{74} } func (x *RefereeStats) GetPartyId() string { @@ -7346,7 +7637,7 @@ type RefereeJoinedReferralSet struct { func (x *RefereeJoinedReferralSet) Reset() { *x = RefereeJoinedReferralSet{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[74] + mi := &file_vega_events_v1_events_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7359,7 +7650,7 @@ func (x *RefereeJoinedReferralSet) String() string { func (*RefereeJoinedReferralSet) ProtoMessage() {} func (x *RefereeJoinedReferralSet) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[74] + mi := &file_vega_events_v1_events_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7372,7 +7663,7 @@ func (x *RefereeJoinedReferralSet) ProtoReflect() protoreflect.Message { // Deprecated: Use RefereeJoinedReferralSet.ProtoReflect.Descriptor instead. func (*RefereeJoinedReferralSet) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{74} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{75} } func (x *RefereeJoinedReferralSet) GetSetId() string { @@ -7419,7 +7710,7 @@ type ReferralProgramStarted struct { func (x *ReferralProgramStarted) Reset() { *x = ReferralProgramStarted{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[75] + mi := &file_vega_events_v1_events_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7432,7 +7723,7 @@ func (x *ReferralProgramStarted) String() string { func (*ReferralProgramStarted) ProtoMessage() {} func (x *ReferralProgramStarted) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[75] + mi := &file_vega_events_v1_events_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7445,7 +7736,7 @@ func (x *ReferralProgramStarted) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralProgramStarted.ProtoReflect.Descriptor instead. func (*ReferralProgramStarted) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{75} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{76} } func (x *ReferralProgramStarted) GetProgram() *vega.ReferralProgram { @@ -7485,7 +7776,7 @@ type ReferralProgramUpdated struct { func (x *ReferralProgramUpdated) Reset() { *x = ReferralProgramUpdated{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[76] + mi := &file_vega_events_v1_events_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7498,7 +7789,7 @@ func (x *ReferralProgramUpdated) String() string { func (*ReferralProgramUpdated) ProtoMessage() {} func (x *ReferralProgramUpdated) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[76] + mi := &file_vega_events_v1_events_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7511,7 +7802,7 @@ func (x *ReferralProgramUpdated) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralProgramUpdated.ProtoReflect.Descriptor instead. func (*ReferralProgramUpdated) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{76} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{77} } func (x *ReferralProgramUpdated) GetProgram() *vega.ReferralProgram { @@ -7553,7 +7844,7 @@ type ReferralProgramEnded struct { func (x *ReferralProgramEnded) Reset() { *x = ReferralProgramEnded{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[77] + mi := &file_vega_events_v1_events_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7566,7 +7857,7 @@ func (x *ReferralProgramEnded) String() string { func (*ReferralProgramEnded) ProtoMessage() {} func (x *ReferralProgramEnded) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[77] + mi := &file_vega_events_v1_events_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7579,7 +7870,7 @@ func (x *ReferralProgramEnded) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralProgramEnded.ProtoReflect.Descriptor instead. func (*ReferralProgramEnded) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{77} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{78} } func (x *ReferralProgramEnded) GetVersion() uint64 { @@ -7626,7 +7917,7 @@ type VolumeDiscountProgramStarted struct { func (x *VolumeDiscountProgramStarted) Reset() { *x = VolumeDiscountProgramStarted{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[78] + mi := &file_vega_events_v1_events_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7639,7 +7930,7 @@ func (x *VolumeDiscountProgramStarted) String() string { func (*VolumeDiscountProgramStarted) ProtoMessage() {} func (x *VolumeDiscountProgramStarted) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[78] + mi := &file_vega_events_v1_events_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7652,7 +7943,7 @@ func (x *VolumeDiscountProgramStarted) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeDiscountProgramStarted.ProtoReflect.Descriptor instead. func (*VolumeDiscountProgramStarted) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{78} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{79} } func (x *VolumeDiscountProgramStarted) GetProgram() *vega.VolumeDiscountProgram { @@ -7692,7 +7983,7 @@ type VolumeDiscountProgramUpdated struct { func (x *VolumeDiscountProgramUpdated) Reset() { *x = VolumeDiscountProgramUpdated{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[79] + mi := &file_vega_events_v1_events_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7705,7 +7996,7 @@ func (x *VolumeDiscountProgramUpdated) String() string { func (*VolumeDiscountProgramUpdated) ProtoMessage() {} func (x *VolumeDiscountProgramUpdated) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[79] + mi := &file_vega_events_v1_events_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7718,7 +8009,7 @@ func (x *VolumeDiscountProgramUpdated) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeDiscountProgramUpdated.ProtoReflect.Descriptor instead. func (*VolumeDiscountProgramUpdated) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{79} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{80} } func (x *VolumeDiscountProgramUpdated) GetProgram() *vega.VolumeDiscountProgram { @@ -7760,7 +8051,7 @@ type VolumeDiscountProgramEnded struct { func (x *VolumeDiscountProgramEnded) Reset() { *x = VolumeDiscountProgramEnded{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[80] + mi := &file_vega_events_v1_events_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7773,7 +8064,7 @@ func (x *VolumeDiscountProgramEnded) String() string { func (*VolumeDiscountProgramEnded) ProtoMessage() {} func (x *VolumeDiscountProgramEnded) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[80] + mi := &file_vega_events_v1_events_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7786,7 +8077,7 @@ func (x *VolumeDiscountProgramEnded) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeDiscountProgramEnded.ProtoReflect.Descriptor instead. func (*VolumeDiscountProgramEnded) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{80} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{81} } func (x *VolumeDiscountProgramEnded) GetVersion() uint64 { @@ -7837,7 +8128,7 @@ type PaidLiquidityFeesStats struct { func (x *PaidLiquidityFeesStats) Reset() { *x = PaidLiquidityFeesStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[81] + mi := &file_vega_events_v1_events_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7850,7 +8141,7 @@ func (x *PaidLiquidityFeesStats) String() string { func (*PaidLiquidityFeesStats) ProtoMessage() {} func (x *PaidLiquidityFeesStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[81] + mi := &file_vega_events_v1_events_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7863,7 +8154,7 @@ func (x *PaidLiquidityFeesStats) ProtoReflect() protoreflect.Message { // Deprecated: Use PaidLiquidityFeesStats.ProtoReflect.Descriptor instead. func (*PaidLiquidityFeesStats) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{81} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{82} } func (x *PaidLiquidityFeesStats) GetMarket() string { @@ -7925,7 +8216,7 @@ type PartyMarginModeUpdated struct { func (x *PartyMarginModeUpdated) Reset() { *x = PartyMarginModeUpdated{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[82] + mi := &file_vega_events_v1_events_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7938,7 +8229,7 @@ func (x *PartyMarginModeUpdated) String() string { func (*PartyMarginModeUpdated) ProtoMessage() {} func (x *PartyMarginModeUpdated) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[82] + mi := &file_vega_events_v1_events_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7951,7 +8242,7 @@ func (x *PartyMarginModeUpdated) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyMarginModeUpdated.ProtoReflect.Descriptor instead. func (*PartyMarginModeUpdated) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{82} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{83} } func (x *PartyMarginModeUpdated) GetMarketId() string { @@ -8015,7 +8306,7 @@ type PartyProfileUpdated struct { func (x *PartyProfileUpdated) Reset() { *x = PartyProfileUpdated{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[83] + mi := &file_vega_events_v1_events_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8028,7 +8319,7 @@ func (x *PartyProfileUpdated) String() string { func (*PartyProfileUpdated) ProtoMessage() {} func (x *PartyProfileUpdated) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[83] + mi := &file_vega_events_v1_events_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8041,7 +8332,7 @@ func (x *PartyProfileUpdated) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyProfileUpdated.ProtoReflect.Descriptor instead. func (*PartyProfileUpdated) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{83} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{84} } func (x *PartyProfileUpdated) GetUpdatedProfile() *vega.PartyProfile { @@ -8066,7 +8357,7 @@ type TeamsStatsUpdated struct { func (x *TeamsStatsUpdated) Reset() { *x = TeamsStatsUpdated{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[84] + mi := &file_vega_events_v1_events_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8079,7 +8370,7 @@ func (x *TeamsStatsUpdated) String() string { func (*TeamsStatsUpdated) ProtoMessage() {} func (x *TeamsStatsUpdated) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[84] + mi := &file_vega_events_v1_events_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8092,7 +8383,7 @@ func (x *TeamsStatsUpdated) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamsStatsUpdated.ProtoReflect.Descriptor instead. func (*TeamsStatsUpdated) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{84} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{85} } func (x *TeamsStatsUpdated) GetAtEpoch() uint64 { @@ -8123,7 +8414,7 @@ type TeamStats struct { func (x *TeamStats) Reset() { *x = TeamStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[85] + mi := &file_vega_events_v1_events_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8136,7 +8427,7 @@ func (x *TeamStats) String() string { func (*TeamStats) ProtoMessage() {} func (x *TeamStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[85] + mi := &file_vega_events_v1_events_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8149,7 +8440,7 @@ func (x *TeamStats) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamStats.ProtoReflect.Descriptor instead. func (*TeamStats) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{85} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{86} } func (x *TeamStats) GetTeamId() string { @@ -8180,7 +8471,7 @@ type TeamMemberStats struct { func (x *TeamMemberStats) Reset() { *x = TeamMemberStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[86] + mi := &file_vega_events_v1_events_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8193,7 +8484,7 @@ func (x *TeamMemberStats) String() string { func (*TeamMemberStats) ProtoMessage() {} func (x *TeamMemberStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[86] + mi := &file_vega_events_v1_events_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8206,7 +8497,7 @@ func (x *TeamMemberStats) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamMemberStats.ProtoReflect.Descriptor instead. func (*TeamMemberStats) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{86} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{87} } func (x *TeamMemberStats) GetPartyId() string { @@ -8323,6 +8614,7 @@ type BusEvent struct { // *BusEvent_TeamsStatsUpdated // *BusEvent_TimeWeightedNotionalPositionUpdated // *BusEvent_CancelledOrders + // *BusEvent_AmmPool // *BusEvent_Market // *BusEvent_TxErrEvent Event isBusEvent_Event `protobuf_oneof:"event"` @@ -8335,7 +8627,7 @@ type BusEvent struct { func (x *BusEvent) Reset() { *x = BusEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[87] + mi := &file_vega_events_v1_events_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8348,7 +8640,7 @@ func (x *BusEvent) String() string { func (*BusEvent) ProtoMessage() {} func (x *BusEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[87] + mi := &file_vega_events_v1_events_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8361,7 +8653,7 @@ func (x *BusEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use BusEvent.ProtoReflect.Descriptor instead. func (*BusEvent) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{87} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{88} } func (x *BusEvent) GetId() string { @@ -8994,6 +9286,13 @@ func (x *BusEvent) GetCancelledOrders() *CancelledOrders { return nil } +func (x *BusEvent) GetAmmPool() *AMMPool { + if x, ok := x.GetEvent().(*BusEvent_AmmPool); ok { + return x.AmmPool + } + return nil +} + func (x *BusEvent) GetMarket() *MarketEvent { if x, ok := x.GetEvent().(*BusEvent_Market); ok { return x.Market @@ -9463,6 +9762,11 @@ type BusEvent_CancelledOrders struct { CancelledOrders *CancelledOrders `protobuf:"bytes,187,opt,name=cancelled_orders,json=cancelledOrders,proto3,oneof"` } +type BusEvent_AmmPool struct { + // Event notifying of an amm pool update. + AmmPool *AMMPool `protobuf:"bytes,188,opt,name=amm_pool,json=ammPool,proto3,oneof"` +} + type BusEvent_Market struct { // Market tick events Market *MarketEvent `protobuf:"bytes,1001,opt,name=market,proto3,oneof"` @@ -9645,10 +9949,97 @@ func (*BusEvent_TimeWeightedNotionalPositionUpdated) isBusEvent_Event() {} func (*BusEvent_CancelledOrders) isBusEvent_Event() {} +func (*BusEvent_AmmPool) isBusEvent_Event() {} + func (*BusEvent_Market) isBusEvent_Event() {} func (*BusEvent_TxErrEvent) isBusEvent_Event() {} +// Liquidity parameters that define the range and shape of the AMM's curve. +type AMMPool_ConcentratedLiquidityParameters struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Base price bound configuration for the pool. + Base string `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` + // Upper price bound configuration for the pool. If unset, the AMM will never hold a short position. + LowerBound string `protobuf:"bytes,2,opt,name=lower_bound,json=lowerBound,proto3" json:"lower_bound,omitempty"` + // Lower price bound configuration for the pool. If unset, the AMM will never hold a long position. + UpperBound string `protobuf:"bytes,3,opt,name=upper_bound,json=upperBound,proto3" json:"upper_bound,omitempty"` + // Margin ratio at upper bounds. + MarginRatioAtUpperBound string `protobuf:"bytes,4,opt,name=margin_ratio_at_upper_bound,json=marginRatioAtUpperBound,proto3" json:"margin_ratio_at_upper_bound,omitempty"` + // Margin ratio at upper bounds. + MarginRatioAtLowerBound string `protobuf:"bytes,5,opt,name=margin_ratio_at_lower_bound,json=marginRatioAtLowerBound,proto3" json:"margin_ratio_at_lower_bound,omitempty"` +} + +func (x *AMMPool_ConcentratedLiquidityParameters) Reset() { + *x = AMMPool_ConcentratedLiquidityParameters{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_events_v1_events_proto_msgTypes[89] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AMMPool_ConcentratedLiquidityParameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AMMPool_ConcentratedLiquidityParameters) ProtoMessage() {} + +func (x *AMMPool_ConcentratedLiquidityParameters) ProtoReflect() protoreflect.Message { + mi := &file_vega_events_v1_events_proto_msgTypes[89] + 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 AMMPool_ConcentratedLiquidityParameters.ProtoReflect.Descriptor instead. +func (*AMMPool_ConcentratedLiquidityParameters) Descriptor() ([]byte, []int) { + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{1, 0} +} + +func (x *AMMPool_ConcentratedLiquidityParameters) GetBase() string { + if x != nil { + return x.Base + } + return "" +} + +func (x *AMMPool_ConcentratedLiquidityParameters) GetLowerBound() string { + if x != nil { + return x.LowerBound + } + return "" +} + +func (x *AMMPool_ConcentratedLiquidityParameters) GetUpperBound() string { + if x != nil { + return x.UpperBound + } + return "" +} + +func (x *AMMPool_ConcentratedLiquidityParameters) GetMarginRatioAtUpperBound() string { + if x != nil { + return x.MarginRatioAtUpperBound + } + return "" +} + +func (x *AMMPool_ConcentratedLiquidityParameters) GetMarginRatioAtLowerBound() string { + if x != nil { + return x.MarginRatioAtLowerBound + } + return "" +} + type TransactionResult_SuccessDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9658,7 +10049,7 @@ type TransactionResult_SuccessDetails struct { func (x *TransactionResult_SuccessDetails) Reset() { *x = TransactionResult_SuccessDetails{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[88] + mi := &file_vega_events_v1_events_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9671,7 +10062,7 @@ func (x *TransactionResult_SuccessDetails) String() string { func (*TransactionResult_SuccessDetails) ProtoMessage() {} func (x *TransactionResult_SuccessDetails) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[88] + mi := &file_vega_events_v1_events_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9684,7 +10075,7 @@ func (x *TransactionResult_SuccessDetails) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionResult_SuccessDetails.ProtoReflect.Descriptor instead. func (*TransactionResult_SuccessDetails) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{38, 0} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{39, 0} } type TransactionResult_FailureDetails struct { @@ -9699,7 +10090,7 @@ type TransactionResult_FailureDetails struct { func (x *TransactionResult_FailureDetails) Reset() { *x = TransactionResult_FailureDetails{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[89] + mi := &file_vega_events_v1_events_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9712,7 +10103,7 @@ func (x *TransactionResult_FailureDetails) String() string { func (*TransactionResult_FailureDetails) ProtoMessage() {} func (x *TransactionResult_FailureDetails) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[89] + mi := &file_vega_events_v1_events_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9725,7 +10116,7 @@ func (x *TransactionResult_FailureDetails) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionResult_FailureDetails.ProtoReflect.Descriptor instead. func (*TransactionResult_FailureDetails) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{38, 1} + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{39, 1} } func (x *TransactionResult_FailureDetails) GetError() string { @@ -9766,683 +10157,762 @@ var file_vega_events_v1_events_proto_rawDesc = []byte{ 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x92, 0x01, 0x0a, 0x16, 0x56, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x53, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, - 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, - 0x71, 0x12, 0x5b, 0x0a, 0x17, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x5f, 0x76, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0xde, - 0x01, 0x0a, 0x13, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x56, 0x0a, 0x15, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, + 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb3, 0x08, 0x0a, 0x07, 0x41, 0x4d, + 0x4d, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, + 0x07, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x70, 0x6f, 0x6f, 0x6c, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x75, 0x62, 0x5f, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x62, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4d, 0x4d, + 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x12, 0x36, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x4d, 0x4d, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x4d, 0x4d, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x1a, 0xf3, 0x01, 0x0a, 0x1f, 0x43, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x75, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3c, 0x0a, + 0x1b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x61, 0x74, + 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x17, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x41, + 0x74, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3c, 0x0a, 0x1b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x61, 0x74, 0x5f, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x17, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x41, 0x74, 0x4c, + 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x8a, 0x01, 0x0a, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, + 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, + 0x45, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, + 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x04, 0x12, 0x16, + 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, + 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x05, 0x22, 0xb6, 0x02, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, + 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x01, 0x12, 0x28, 0x0a, 0x24, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x43, 0x41, + 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x4c, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, + 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x2b, 0x0a, 0x27, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x41, 0x4c, + 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x4f, 0x57, 0x4e, 0x53, 0x5f, 0x41, 0x5f, 0x50, 0x4f, 0x4f, + 0x4c, 0x10, 0x03, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, + 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, + 0x44, 0x5f, 0x4f, 0x55, 0x54, 0x10, 0x04, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, + 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x05, 0x12, 0x24, 0x0a, 0x20, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, + 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x06, 0x12, 0x1f, + 0x0a, 0x1b, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, + 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x42, 0x41, 0x53, 0x45, 0x10, 0x07, 0x22, + 0x92, 0x01, 0x0a, 0x16, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, 0x5b, 0x0a, 0x17, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x5f, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x15, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x22, 0xde, 0x01, 0x0a, 0x13, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x12, 0x56, 0x0a, 0x15, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, + 0x65, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x13, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4c, 0x6f, 0x63, 0x6b, + 0x65, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x16, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x5f, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, + 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, + 0x14, 0x70, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x65, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4c, 0x6f, + 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x45, 0x0a, 0x13, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x22, 0x77, 0x0a, 0x1a, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x3e, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, - 0x74, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, - 0x13, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x16, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x76, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x14, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, - 0x65, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x75, - 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0a, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x18, 0x0a, 0x07, - 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x45, 0x0a, 0x13, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x77, 0x0a, - 0x1a, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, + 0x74, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x85, 0x01, 0x0a, + 0x18, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, + 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x25, 0x0a, + 0x0e, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x69, 0x0a, 0x13, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, - 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x3e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x85, 0x01, 0x0a, 0x18, 0x50, 0x61, 0x72, 0x74, 0x79, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x27, - 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x69, - 0x0a, 0x13, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x12, 0x37, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x11, 0x50, 0x61, - 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, - 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x72, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x5f, 0x62, 0x6f, 0x6e, 0x75, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x72, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x42, 0x6f, 0x6e, 0x75, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, - 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x62, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x71, 0x75, 0x61, - 0x6e, 0x74, 0x75, 0x6d, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0xd0, 0x05, 0x0a, 0x09, - 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x5f, 0x73, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x53, 0x65, 0x71, 0x12, 0x51, 0x0a, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x66, 0x0a, 0x1a, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x72, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x67, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, + 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x37, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, + 0x8f, 0x01, 0x0a, 0x11, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, + 0x12, 0x36, 0x0a, 0x17, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x62, 0x6f, 0x6e, 0x75, 0x73, + 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x15, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x42, 0x6f, 0x6e, 0x75, 0x73, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, + 0x74, 0x75, 0x6d, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x22, 0xd0, 0x05, 0x0a, 0x09, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, 0x51, 0x0a, 0x16, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, + 0x79, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x66, 0x0a, + 0x1a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x73, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x52, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x52, 0x18, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x52, 0x18, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x52, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x12, - 0x57, 0x0a, 0x19, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, - 0x17, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x17, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x12, 0x57, 0x0a, 0x19, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, + 0x73, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x17, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x44, + 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x53, + 0x0a, 0x17, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x15, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x65, 0x64, 0x12, 0x56, 0x0a, 0x19, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6b, + 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x52, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x61, 0x6b, 0x65, 0x72, 0x46, + 0x65, 0x65, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x54, 0x0a, 0x14, 0x6d, + 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x72, + 0x46, 0x65, 0x65, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x52, 0x12, 0x6d, + 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x12, 0x5b, 0x0a, 0x1c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, + 0x70, 0x61, 0x69, 0x64, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x18, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x65, 0x73, 0x50, + 0x61, 0x69, 0x64, 0x41, 0x6e, 0x64, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x4a, 0x04, + 0x08, 0x0a, 0x10, 0x0b, 0x22, 0x7e, 0x0a, 0x18, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, + 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x10, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x52, 0x0f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x22, 0x6f, 0x0a, 0x12, 0x4d, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, + 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, + 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x6b, 0x65, 0x72, + 0x12, 0x43, 0x0a, 0x0f, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x70, + 0x61, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, - 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x15, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, - 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x56, 0x0a, - 0x19, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, - 0x73, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x16, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x54, 0x0a, 0x14, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, - 0x65, 0x65, 0x73, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x52, 0x12, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, - 0x65, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x12, 0x5b, 0x0a, 0x1c, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x61, - 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x18, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x65, 0x73, 0x50, 0x61, 0x69, 0x64, 0x41, 0x6e, 0x64, - 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x0a, 0x10, 0x0b, 0x22, 0x7e, - 0x0a, 0x18, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x10, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0f, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x22, 0x6f, - 0x0a, 0x12, 0x4d, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x0f, 0x6d, 0x61, - 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x70, 0x61, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x0d, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x50, 0x61, 0x69, 0x64, 0x22, - 0x62, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, - 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x41, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x8a, 0x03, 0x0a, 0x13, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72, - 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x66, 0x6f, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x46, 0x6f, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x12, 0x55, 0x0a, 0x27, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, - 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x24, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x22, 0x72, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x5f, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, - 0x74, 0x79, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x1f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x56, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, - 0x6c, 0x69, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, - 0x61, 0x64, 0x65, 0x64, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, - 0x1f, 0x0a, 0x0b, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x22, 0xe6, 0x02, 0x0a, 0x0d, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, - 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, 0x65, - 0x71, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x15, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2c, - 0x0a, 0x0f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0e, 0x66, 0x75, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, - 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x02, 0x52, 0x0b, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x5f, 0x74, 0x77, 0x61, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0c, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x77, 0x61, 0x70, 0x88, 0x01, 0x01, 0x12, 0x28, - 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x77, 0x61, 0x70, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x54, 0x77, 0x61, 0x70, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x6e, 0x64, - 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x5f, 0x72, 0x61, 0x74, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x5f, 0x74, 0x77, 0x61, 0x70, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x77, 0x61, 0x70, 0x22, 0x43, 0x0a, 0x0e, 0x46, 0x75, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7c, - 0x0a, 0x0f, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x10, - 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, - 0x12, 0x3a, 0x0a, 0x08, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x08, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xb2, 0x02, 0x0a, - 0x16, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0d, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, + 0x73, 0x50, 0x61, 0x69, 0x64, 0x22, 0x62, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x71, 0x75, 0x61, 0x6e, + 0x74, 0x75, 0x6d, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x8a, 0x03, 0x0a, 0x13, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x69, 0x6e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x55, 0x0a, 0x27, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x24, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x44, + 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x79, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x4b, 0x0a, + 0x22, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x69, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1f, 0x72, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x6e, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0xe6, 0x02, 0x0a, 0x0d, 0x46, 0x75, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x15, 0x0a, + 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x03, 0x65, 0x6e, + 0x64, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, + 0x0e, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x88, + 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, + 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0b, 0x66, 0x75, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x77, 0x61, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x03, 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x77, 0x61, + 0x70, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5f, 0x74, 0x77, 0x61, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0c, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x77, 0x61, 0x70, 0x88, 0x01, 0x01, 0x42, 0x06, + 0x0a, 0x04, 0x5f, 0x65, 0x6e, 0x64, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x66, + 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x77, 0x61, 0x70, 0x42, 0x10, 0x0a, + 0x0e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x77, 0x61, 0x70, 0x22, + 0x43, 0x0a, 0x0e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7c, 0x0a, 0x0f, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, + 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x55, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x2d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0d, - 0x64, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x77, 0x61, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x77, 0x61, 0x70, 0x22, 0x4a, 0x0a, 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, - 0x16, 0x0a, 0x12, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, - 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, - 0x02, 0x22, 0x83, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0a, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x73, 0x75, 0x62, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x5f, - 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x09, 0x73, 0x74, - 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x89, 0x02, 0x0a, 0x18, 0x45, 0x52, 0x43, 0x32, - 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x5f, - 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, - 0x77, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x49, 0x64, 0x22, 0x66, 0x0a, 0x23, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x64, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, + 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x3a, 0x0a, 0x08, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0xb2, 0x02, 0x0a, 0x16, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, + 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x55, 0x0a, 0x0f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x77, 0x61, 0x70, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x77, 0x61, 0x70, 0x22, 0x4a, 0x0a, 0x06, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, + 0x0f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, + 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x54, + 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x02, 0x22, 0x83, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0a, 0x73, 0x75, + 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, + 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x89, 0x02, + 0x0a, 0x18, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, + 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, - 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x22, 0xb2, 0x02, 0x0a, 0x1a, + 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, + 0x0c, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1d, + 0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x77, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x1c, 0x0a, + 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6e, + 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, 0x19, + 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x66, 0x0a, 0x23, 0x45, 0x52, 0x43, + 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, + 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x72, 0x22, 0xb2, 0x02, 0x0a, 0x1a, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, + 0x12, 0x66, 0x0a, 0x14, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x75, + 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x66, 0x0a, 0x14, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x64, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x52, 0x13, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x72, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x6c, 0x64, 0x53, 0x69, 0x67, 0x6e, - 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, - 0x22, 0xf6, 0x06, 0x0a, 0x08, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x72, 0x6f, - 0x6d, 0x12, 0x3d, 0x0a, 0x11, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x0f, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, - 0x12, 0x39, 0x0a, 0x0f, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x74, 0x6f, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1b, - 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, - 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x67, - 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, - 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x6e, 0x65, - 0x5f, 0x6f, 0x66, 0x66, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x6e, 0x65, 0x4f, - 0x66, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x6e, - 0x65, 0x4f, 0x66, 0x66, 0x12, 0x41, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, - 0x67, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, - 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, - 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x58, 0x0a, 0x12, 0x6f, 0x6e, 0x65, 0x5f, 0x6f, - 0x66, 0x66, 0x5f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x67, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x47, 0x6f, 0x76, 0x65, 0x72, - 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, - 0x10, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, - 0x65, 0x12, 0x60, 0x0a, 0x14, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x67, - 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, - 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x13, - 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, - 0x6e, 0x63, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, - 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, - 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, - 0x45, 0x44, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, - 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x05, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, - 0x08, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x39, 0x0a, 0x18, 0x4f, 0x6e, 0x65, - 0x4f, 0x66, 0x66, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x5f, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x4f, 0x6e, 0x22, 0x2f, 0x0a, 0x0e, 0x4f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x5f, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x4f, 0x6e, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, - 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x09, - 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, - 0x00, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x16, - 0x0a, 0x06, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x43, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, - 0x63, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x10, 0x64, 0x69, 0x73, 0x70, 0x61, - 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, - 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x52, 0x65, - 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, - 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x6e, - 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, - 0x08, 0x65, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x11, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x72, 0x52, 0x13, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x75, + 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x6c, 0x64, + 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, + 0x6c, 0x64, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, 0x19, 0x0a, 0x08, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0xf6, 0x06, 0x0a, 0x08, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x3d, 0x0a, 0x11, 0x66, 0x72, 0x6f, 0x6d, 0x5f, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x39, 0x0a, 0x0f, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0d, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x37, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, + 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x39, 0x0a, 0x07, 0x6f, 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x4f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x48, 0x00, 0x52, 0x06, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x12, 0x41, 0x0a, 0x09, 0x72, 0x65, + 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x58, 0x0a, + 0x12, 0x6f, 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x5f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x6e, 0x65, 0x4f, 0x66, + 0x66, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x47, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x60, 0x0a, 0x14, 0x72, 0x65, 0x63, 0x75, 0x72, + 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x18, + 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, + 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x48, 0x00, 0x52, 0x13, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x47, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, + 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, + 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x4a, 0x45, + 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x05, + 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x22, + 0x39, 0x0a, 0x18, 0x4f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x64, + 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x4f, 0x6e, 0x22, 0x2f, 0x0a, 0x0e, 0x4f, 0x6e, + 0x65, 0x4f, 0x66, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, + 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x4f, 0x6e, 0x22, 0xc1, 0x01, 0x0a, 0x11, + 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x43, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, - 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, - 0x01, 0x52, 0x10, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, - 0x65, 0x67, 0x79, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0xb4, 0x04, 0x0a, 0x0c, 0x53, - 0x74, 0x61, 0x6b, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, - 0x4c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, - 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, - 0x0c, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, - 0x6f, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, - 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x22, 0x3c, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x10, 0x01, - 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4c, 0x49, 0x4e, 0x4b, 0x10, - 0x02, 0x22, 0x5e, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, - 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55, - 0x53, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x50, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, - 0x03, 0x22, 0xee, 0x02, 0x0a, 0x18, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, - 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x41, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x52, - 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, - 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, - 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x17, - 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x01, - 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, - 0x10, 0x02, 0x22, 0xfe, 0x01, 0x0a, 0x1e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x53, 0x69, 0x67, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x74, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6e, 0x65, - 0x77, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, - 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x67, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x49, 0x64, 0x22, 0x67, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x2d, 0x0a, 0x10, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0xef, 0x02, 0x0a, 0x11, - 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x5f, 0x73, 0x65, 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x53, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x17, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x6f, 0x66, - 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x4f, 0x66, 0x54, 0x6f, - 0x74, 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x6f, 0x63, 0x6b, - 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x55, 0x6e, 0x74, 0x69, - 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x25, 0x0a, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, - 0x6d, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, - 0x07, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, - 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x22, 0xd6, 0x02, - 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x63, 0x6f, 0x72, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1b, - 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, 0x27, 0x0a, 0x0f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, - 0x63, 0x6f, 0x72, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x73, - 0x65, 0x64, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, - 0x33, 0x0a, 0x15, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x61, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x72, 0x61, 0x77, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, - 0x63, 0x6f, 0x72, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x25, 0x0a, 0x0e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x63, 0x6f, 0x72, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, - 0x67, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x7c, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, + 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, + 0x10, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, + 0xce, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x47, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, + 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x12, 0x20, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, + 0x01, 0x01, 0x12, 0x48, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, + 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, 0x01, 0x52, 0x10, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, + 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, + 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x64, + 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, + 0x22, 0xb4, 0x04, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, + 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x35, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x16, + 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x4c, 0x69, 0x6e, + 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x64, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x29, + 0x0a, 0x10, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3c, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x4c, 0x49, 0x4e, 0x4b, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, + 0x4e, 0x4c, 0x49, 0x4e, 0x4b, 0x10, 0x02, 0x22, 0x5e, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x13, 0x0a, + 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x50, 0x54, 0x45, 0x44, + 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x4a, + 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x22, 0xee, 0x02, 0x0a, 0x18, 0x45, 0x52, 0x43, 0x32, + 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x41, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, + 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1b, 0x0a, + 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x19, 0x0a, + 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, + 0x44, 0x44, 0x45, 0x44, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, + 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x02, 0x22, 0xfe, 0x01, 0x0a, 0x1e, 0x45, 0x52, 0x43, + 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6e, + 0x65, 0x77, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1b, + 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x21, 0x0a, 0x0c, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x19, + 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x67, 0x0a, 0x0f, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, + 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x22, 0x2d, 0x0a, 0x10, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, + 0x64, 0x22, 0xef, 0x02, 0x0a, 0x11, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x50, 0x61, 0x79, 0x6f, + 0x75, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1b, 0x0a, + 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x17, 0x70, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x5f, 0x6f, 0x66, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1f, 0x0a, + 0x0b, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2c, + 0x0a, 0x12, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x6f, 0x63, 0x6b, + 0x65, 0x64, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x25, 0x0a, 0x0e, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x41, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x4a, 0x04, 0x08, + 0x08, 0x10, 0x09, 0x22, 0xd6, 0x02, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, + 0x64, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, + 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, + 0x71, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, + 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, + 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x33, 0x0a, 0x15, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, + 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x61, + 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x6f, 0x72, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x61, 0x77, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, + 0x67, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x7c, 0x0a, 0x16, + 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x17, 0x0a, 0x07, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, + 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x22, 0x44, 0x0a, 0x0b, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x22, 0x88, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, + 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x12, 0x29, 0x0a, 0x10, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x69, 0x73, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x22, 0x70, 0x0a, 0x14, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x44, 0x69, 0x73, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x5f, 0x73, 0x65, 0x71, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x53, 0x65, 0x71, 0x22, 0x44, 0x0a, 0x0b, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x88, 0x01, 0x0a, 0x0c, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x69, - 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, - 0x70, 0x6c, 0x69, 0x65, 0x64, 0x22, 0x70, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x46, 0x65, 0x65, 0x73, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0xf8, 0x16, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x19, 0x0a, - 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x68, 0x61, 0x73, 0x68, 0x12, 0x4e, 0x0a, 0x10, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x75, - 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x48, 0x00, 0x52, 0x0f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x0f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x6d, - 0x65, 0x6e, 0x64, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x41, 0x6d, 0x65, 0x6e, 0x64, 0x6d, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x0e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x41, 0x6d, 0x65, 0x6e, 0x64, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x54, 0x0a, 0x12, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x11, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, - 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x4b, 0x0a, 0x0f, 0x76, - 0x6f, 0x74, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x69, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0e, 0x76, 0x6f, 0x74, 0x65, 0x53, 0x75, - 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x76, 0x0a, 0x1e, 0x6c, 0x69, 0x71, 0x75, - 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, - 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x48, 0x00, 0x52, 0x1c, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x57, 0x0a, 0x13, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x73, 0x75, 0x62, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x57, 0x0a, 0x13, 0x64, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x6c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, - 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x5d, 0x0a, 0x15, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, - 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x6d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x14, 0x75, 0x6e, 0x64, - 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x7c, 0x0a, 0x20, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, - 0x1e, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x73, 0x0a, 0x1d, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6d, 0x65, 0x6e, 0x64, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x70, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, + 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0xb2, 0x18, + 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x4e, 0x0a, 0x10, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x65, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x75, 0x62, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0f, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x0f, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x5f, 0x61, 0x6d, 0x65, 0x6e, 0x64, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x41, 0x6d, 0x65, 0x6e, + 0x64, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x41, 0x6d, + 0x65, 0x6e, 0x64, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x12, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x5f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x67, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x11, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x12, 0x4b, 0x0a, 0x0f, 0x76, 0x6f, 0x74, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x69, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, + 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0e, + 0x76, 0x6f, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x76, + 0x0a, 0x1e, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x6d, 0x65, 0x6e, - 0x64, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1b, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, - 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x6d, 0x65, 0x6e, 0x64, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x4b, - 0x0a, 0x0f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x18, 0x72, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x0d, 0x61, - 0x6e, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x73, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x4e, 0x6f, - 0x64, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x6e, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x4e, 0x6f, - 0x64, 0x65, 0x12, 0x5e, 0x0a, 0x16, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x74, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x14, 0x6f, 0x72, - 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x67, 0x0a, 0x19, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x75, - 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, - 0x75, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 0x48, 0x00, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, - 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x4e, 0x0a, 0x10, 0x69, - 0x73, 0x73, 0x75, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, - 0x76, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x69, 0x73, 0x73, 0x75, - 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x67, 0x0a, 0x19, 0x62, - 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x77, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x6e, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x17, 0x62, 0x61, 0x74, - 0x63, 0x68, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5b, 0x0a, 0x15, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, - 0x74, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x78, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, - 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x13, 0x6b, 0x65, - 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x74, 0x0a, 0x1e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x6b, 0x65, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x1c, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x57, 0x0a, 0x13, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x6b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x53, + 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, 0x77, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x57, 0x0a, 0x13, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, + 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x5d, 0x0a, 0x15, 0x75, 0x6e, 0x64, 0x65, + 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x6c, + 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, + 0x00, 0x52, 0x14, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x7c, 0x0a, 0x20, 0x6c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x6f, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x30, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x1e, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x73, 0x0a, 0x1d, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6d, 0x65, + 0x6e, 0x64, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x70, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x41, 0x6d, 0x65, 0x6e, 0x64, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1b, 0x6c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x41, 0x6d, 0x65, 0x6e, 0x64, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x0f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x72, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, + 0x00, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x12, 0x45, 0x0a, 0x0d, 0x61, 0x6e, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x18, 0x73, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, + 0x75, 0x6e, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x6e, 0x6e, 0x6f, + 0x75, 0x6e, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x5e, 0x0a, 0x16, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x74, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x48, 0x00, 0x52, 0x14, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x75, + 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x67, 0x0a, 0x19, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x75, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x12, 0x4e, 0x0a, 0x10, 0x69, 0x73, 0x73, 0x75, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x76, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, + 0x73, 0x73, 0x75, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x48, 0x00, + 0x52, 0x0f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x12, 0x67, 0x0a, 0x19, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x77, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, + 0x00, 0x52, 0x17, 0x62, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5b, 0x0a, 0x15, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x79, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, - 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x1b, 0x65, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x5e, 0x0a, 0x16, 0x73, 0x74, 0x6f, 0x70, 0x5f, - 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x7a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x73, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, - 0x00, 0x52, 0x14, 0x73, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x53, 0x75, 0x62, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x64, 0x0a, 0x18, 0x73, 0x74, 0x6f, 0x70, 0x5f, - 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x7b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, + 0x69, 0x6f, 0x6e, 0x18, 0x78, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, + 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x48, 0x00, 0x52, 0x13, 0x6b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x74, 0x0a, 0x1e, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x73, + 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x79, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, + 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, + 0x52, 0x1b, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, + 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x5e, 0x0a, + 0x16, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x73, 0x75, 0x62, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x7a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x53, 0x75, 0x62, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x14, 0x73, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x73, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x64, 0x0a, + 0x18, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x63, 0x61, 0x6e, + 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x7b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x43, 0x61, 0x6e, + 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x16, 0x73, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x16, 0x73, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x73, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, - 0x13, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, - 0x5f, 0x73, 0x65, 0x74, 0x18, 0x7c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x48, - 0x00, 0x52, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, - 0x6c, 0x53, 0x65, 0x74, 0x12, 0x55, 0x0a, 0x13, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x7d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x48, 0x00, 0x52, 0x11, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x12, 0x55, 0x0a, 0x13, 0x61, - 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x7e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, - 0x79, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, - 0x11, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x43, 0x6f, - 0x64, 0x65, 0x12, 0x52, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x7f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x13, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x7c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x61, 0x6c, 0x53, 0x65, 0x74, 0x48, 0x00, 0x52, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x12, 0x55, 0x0a, 0x13, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, + 0x74, 0x18, 0x7d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x48, 0x00, 0x52, 0x11, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, + 0x74, 0x12, 0x55, 0x0a, 0x13, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x7e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, - 0x64, 0x65, 0x48, 0x00, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x67, - 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x74, - 0x65, 0x61, 0x6d, 0x18, 0x80, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, - 0x69, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x65, - 0x61, 0x6d, 0x12, 0x53, 0x0a, 0x0e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x81, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0d, 0x62, 0x61, 0x74, 0x63, 0x68, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x59, 0x0a, 0x14, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, - 0x82, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x12, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x12, 0x4d, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0xe9, 0x07, + 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x43, + 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x11, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x52, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x7f, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3a, 0x0a, 0x09, + 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x80, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x08, + 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x53, 0x0a, 0x0e, 0x62, 0x61, 0x74, 0x63, + 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x81, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0d, + 0x62, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x59, 0x0a, + 0x14, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x70, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x82, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x48, 0x00, 0x52, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x73, 0x75, 0x62, 0x6d, + 0x69, 0x74, 0x5f, 0x61, 0x6d, 0x6d, 0x18, 0x83, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x41, 0x4d, 0x4d, 0x48, 0x00, 0x52, 0x09, 0x73, 0x75, + 0x62, 0x6d, 0x69, 0x74, 0x41, 0x6d, 0x6d, 0x12, 0x3a, 0x0a, 0x09, 0x61, 0x6d, 0x65, 0x6e, 0x64, + 0x5f, 0x61, 0x6d, 0x6d, 0x18, 0x84, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x6d, 0x65, 0x6e, 0x64, 0x41, 0x4d, 0x4d, 0x48, 0x00, 0x52, 0x08, 0x61, 0x6d, 0x65, 0x6e, 0x64, + 0x41, 0x6d, 0x6d, 0x12, 0x3d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x61, 0x6d, + 0x6d, 0x18, 0x85, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x41, 0x4d, 0x4d, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x41, + 0x6d, 0x6d, 0x12, 0x4d, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x44, @@ -11021,7 +11491,7 @@ var file_vega_events_v1_events_proto_rawDesc = []byte{ 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, - 0xb6, 0x37, 0x0a, 0x08, 0x42, 0x75, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0xed, 0x37, 0x0a, 0x08, 0x42, 0x75, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, @@ -11451,257 +11921,262 @@ var file_vega_events_v1_events_proto_rawDesc = []byte{ 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x41, - 0x0a, 0x0c, 0x74, 0x78, 0x5f, 0x65, 0x72, 0x72, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0xd1, - 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x78, 0x45, 0x72, 0x72, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x42, - 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2a, 0xdd, 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x0a, 0x2c, 0x50, 0x52, - 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x50, - 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2c, 0x0a, 0x28, - 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, - 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x52, - 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x50, - 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, - 0x50, 0x50, 0x52, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x02, 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x52, 0x4f, - 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x50, 0x52, - 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, - 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x2a, 0xad, 0x1b, 0x0a, 0x0c, 0x42, 0x75, 0x73, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x42, 0x55, 0x53, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x10, - 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, - 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x45, 0x44, 0x47, 0x45, 0x52, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x4d, - 0x45, 0x4e, 0x54, 0x53, 0x10, 0x03, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x18, - 0x0a, 0x14, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x53, 0x5f, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, - 0x4e, 0x54, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x07, 0x12, 0x18, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x61, 0x6d, 0x6d, 0x5f, 0x70, 0x6f, + 0x6f, 0x6c, 0x18, 0xbc, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4d, 0x4d, 0x50, 0x6f, + 0x6f, 0x6c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x6d, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x36, 0x0a, + 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x74, 0x78, 0x5f, 0x65, 0x72, 0x72, 0x5f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0xd1, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x78, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x78, + 0x45, 0x72, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2a, + 0xdd, 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x30, 0x0a, 0x2c, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, + 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x2c, 0x0a, 0x28, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, + 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, + 0x01, 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, + 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x52, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x02, + 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, 0x47, + 0x52, 0x41, 0x44, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x2a, + 0xca, 0x1b, 0x0a, 0x0c, 0x42, 0x75, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x16, 0x0a, 0x12, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, + 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x55, 0x53, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x45, 0x44, 0x47, 0x45, + 0x52, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x53, 0x10, 0x03, 0x12, 0x26, 0x0a, + 0x22, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x55, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x14, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x05, 0x12, + 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x42, + 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, + 0x52, 0x54, 0x59, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x45, 0x10, 0x08, 0x12, + 0x20, 0x0a, 0x1c, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x53, 0x10, + 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x10, 0x0a, 0x12, 0x17, + 0x0a, 0x13, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x56, 0x4f, 0x54, 0x45, 0x10, 0x0b, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, + 0x5f, 0x44, 0x41, 0x54, 0x41, 0x10, 0x0c, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, + 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x10, 0x0d, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x55, + 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x53, + 0x53, 0x5f, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, + 0x0e, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x0f, 0x12, 0x24, 0x0a, 0x20, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, 0x5f, 0x44, + 0x49, 0x53, 0x54, 0x52, 0x45, 0x53, 0x53, 0x45, 0x44, 0x10, 0x10, 0x12, 0x21, 0x0a, 0x1d, 0x42, + 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, + 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x11, 0x12, 0x18, 0x0a, 0x14, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x54, 0x52, 0x41, 0x44, 0x45, 0x10, 0x08, 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x55, 0x53, 0x5f, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, - 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x53, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x42, 0x55, - 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, - 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x10, 0x0a, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x55, 0x53, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x54, 0x45, 0x10, 0x0b, + 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x10, 0x12, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, + 0x54, 0x5f, 0x54, 0x49, 0x43, 0x4b, 0x10, 0x13, 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x55, 0x53, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x44, + 0x52, 0x41, 0x57, 0x41, 0x4c, 0x10, 0x14, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x53, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, + 0x54, 0x10, 0x15, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x16, 0x12, + 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x52, 0x49, 0x53, 0x4b, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x17, 0x12, + 0x24, 0x0a, 0x20, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, + 0x54, 0x45, 0x52, 0x10, 0x18, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, + 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x19, 0x12, 0x21, 0x0a, + 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x1a, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x10, 0x0c, - 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, - 0x45, 0x10, 0x0d, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x53, 0x53, 0x5f, 0x53, 0x4f, 0x43, 0x49, 0x41, - 0x4c, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0e, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x55, - 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x54, - 0x54, 0x4c, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0f, 0x12, 0x24, - 0x0a, 0x20, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x45, 0x53, 0x53, - 0x45, 0x44, 0x10, 0x10, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x52, - 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x11, 0x12, 0x18, 0x0a, 0x14, 0x42, 0x55, 0x53, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x10, - 0x12, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x49, 0x43, 0x4b, 0x10, - 0x13, 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, 0x10, 0x14, - 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x10, 0x15, 0x12, 0x1a, 0x0a, 0x16, - 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, - 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x16, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x49, 0x53, 0x4b, 0x5f, - 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x17, 0x12, 0x24, 0x0a, 0x20, 0x42, 0x55, 0x53, 0x5f, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, - 0x52, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x10, 0x18, 0x12, 0x26, - 0x0a, 0x22, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, - 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x19, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, - 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x1a, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x41, 0x43, - 0x4c, 0x45, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x10, 0x1b, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x41, 0x43, - 0x4c, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x10, 0x1c, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x55, 0x53, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, - 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x1d, - 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x43, 0x4f, - 0x52, 0x45, 0x10, 0x1e, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x50, 0x4f, 0x43, 0x48, 0x5f, 0x55, 0x50, 0x44, - 0x41, 0x54, 0x45, 0x10, 0x1f, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, - 0x52, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x20, 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x55, - 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, - 0x4b, 0x45, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x21, 0x12, 0x26, 0x0a, 0x22, - 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, - 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4f, 0x55, 0x54, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x10, 0x22, 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, - 0x54, 0x10, 0x23, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x53, 0x54, 0x41, - 0x52, 0x54, 0x10, 0x24, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x52, 0x4f, 0x54, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x10, 0x25, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, 0x41, - 0x52, 0x10, 0x26, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x4c, 0x49, - 0x4d, 0x49, 0x54, 0x53, 0x10, 0x27, 0x12, 0x1b, 0x0a, 0x17, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, - 0x52, 0x10, 0x28, 0x12, 0x24, 0x0a, 0x20, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, - 0x52, 0x41, 0x4e, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x29, 0x12, 0x2f, 0x0a, 0x2b, 0x42, 0x55, 0x53, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x52, 0x43, 0x32, - 0x30, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x53, 0x49, 0x47, 0x5f, 0x53, 0x49, 0x47, 0x4e, - 0x45, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x2a, 0x12, 0x30, 0x0a, 0x2c, 0x42, 0x55, - 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x52, 0x43, - 0x32, 0x30, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x53, 0x49, 0x47, 0x5f, 0x53, 0x45, 0x54, - 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x10, 0x2b, 0x12, 0x2f, 0x0a, 0x2b, - 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, - 0x52, 0x43, 0x32, 0x30, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x53, 0x49, 0x47, 0x5f, 0x53, - 0x49, 0x47, 0x4e, 0x45, 0x52, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x2c, 0x12, 0x31, 0x0a, - 0x2d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x45, 0x52, 0x43, 0x32, 0x30, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x53, 0x49, 0x47, 0x5f, - 0x53, 0x49, 0x47, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x2d, - 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x10, 0x2e, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x54, 0x48, 0x45, 0x52, 0x45, 0x55, 0x4d, 0x5f, 0x4b, - 0x45, 0x59, 0x5f, 0x52, 0x4f, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x2f, 0x12, 0x2c, 0x0a, - 0x28, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, - 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x10, 0x30, 0x12, 0x1e, 0x0a, 0x1a, 0x42, - 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x45, - 0x47, 0x49, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x31, 0x12, 0x1c, 0x0a, 0x18, 0x42, - 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, - 0x44, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x32, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x53, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x54, - 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, - 0x52, 0x54, 0x45, 0x44, 0x10, 0x33, 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, 0x5f, - 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x34, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x55, 0x53, 0x5f, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, - 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x10, 0x35, 0x12, - 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x54, 0x41, 0x4b, 0x45, 0x4e, - 0x10, 0x36, 0x12, 0x33, 0x0a, 0x2f, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, - 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, - 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x37, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x53, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x45, - 0x53, 0x53, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x5f, 0x43, 0x4c, 0x4f, 0x53, - 0x45, 0x44, 0x10, 0x38, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x5f, 0x4f, - 0x52, 0x44, 0x45, 0x52, 0x53, 0x10, 0x39, 0x12, 0x27, 0x0a, 0x23, 0x42, 0x55, 0x53, 0x5f, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x45, - 0x53, 0x53, 0x45, 0x44, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x3a, + 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x41, 0x43, 0x4c, 0x45, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x10, 0x1b, + 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x41, 0x43, 0x4c, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x10, 0x1c, + 0x12, 0x25, 0x0a, 0x21, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x41, + 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x1d, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x55, 0x53, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, + 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x43, 0x4f, 0x52, 0x45, 0x10, 0x1e, 0x12, 0x1f, 0x0a, 0x1b, 0x42, + 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x50, + 0x4f, 0x43, 0x48, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x1f, 0x12, 0x23, 0x0a, 0x1f, + 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, + 0x20, 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x4b, 0x45, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x49, 0x4e, + 0x47, 0x10, 0x21, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x59, + 0x4f, 0x55, 0x54, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x22, 0x12, 0x1d, 0x0a, 0x19, 0x42, + 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x48, + 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x23, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x55, + 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, + 0x45, 0x41, 0x4d, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x24, 0x12, 0x1f, 0x0a, 0x1b, 0x42, + 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x45, + 0x59, 0x5f, 0x52, 0x4f, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x25, 0x12, 0x1c, 0x0a, 0x18, + 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x56, 0x41, 0x52, 0x10, 0x26, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, + 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, + 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x53, 0x10, 0x27, 0x12, 0x1b, 0x0a, + 0x17, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x10, 0x28, 0x12, 0x24, 0x0a, 0x20, 0x42, 0x55, + 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x41, 0x4c, + 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x29, + 0x12, 0x2f, 0x0a, 0x2b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x45, 0x52, 0x43, 0x32, 0x30, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x53, + 0x49, 0x47, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, + 0x2a, 0x12, 0x30, 0x0a, 0x2c, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x45, 0x52, 0x43, 0x32, 0x30, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, + 0x53, 0x49, 0x47, 0x5f, 0x53, 0x45, 0x54, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, + 0x44, 0x10, 0x2b, 0x12, 0x2f, 0x0a, 0x2b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x52, 0x43, 0x32, 0x30, 0x5f, 0x4d, 0x55, 0x4c, 0x54, + 0x49, 0x5f, 0x53, 0x49, 0x47, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x52, 0x5f, 0x41, 0x44, 0x44, + 0x45, 0x44, 0x10, 0x2c, 0x12, 0x31, 0x0a, 0x2d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x52, 0x43, 0x32, 0x30, 0x5f, 0x4d, 0x55, 0x4c, + 0x54, 0x49, 0x5f, 0x53, 0x49, 0x47, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x45, + 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x2d, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x2e, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x55, + 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x54, 0x48, + 0x45, 0x52, 0x45, 0x55, 0x4d, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x52, 0x4f, 0x54, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x2f, 0x12, 0x2c, 0x0a, 0x28, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, + 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, + 0x10, 0x30, 0x12, 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, + 0x10, 0x31, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x44, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x32, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x53, 0x50, 0x4f, 0x54, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, - 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x3b, 0x12, 0x1d, 0x0a, - 0x19, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x3c, 0x12, 0x21, 0x0a, 0x1d, - 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, - 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x10, 0x3d, 0x12, - 0x2c, 0x0a, 0x28, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, - 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x3e, 0x12, 0x1f, 0x0a, - 0x1b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x3f, 0x12, 0x1f, - 0x0a, 0x1b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x40, 0x12, - 0x28, 0x0a, 0x24, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x45, 0x5f, 0x53, 0x57, 0x49, 0x54, 0x43, 0x48, - 0x45, 0x44, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, 0x41, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x55, 0x53, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, - 0x52, 0x45, 0x45, 0x5f, 0x4a, 0x4f, 0x49, 0x4e, 0x45, 0x44, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, - 0x42, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, - 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x43, 0x12, 0x2b, + 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, + 0x41, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x33, 0x12, 0x20, 0x0a, + 0x1c, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x34, 0x12, + 0x25, 0x0a, 0x21, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, + 0x53, 0x55, 0x4c, 0x54, 0x10, 0x35, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, + 0x54, 0x5f, 0x54, 0x41, 0x4b, 0x45, 0x4e, 0x10, 0x36, 0x12, 0x33, 0x0a, 0x2f, 0x42, 0x55, 0x53, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x54, + 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x44, 0x41, 0x54, + 0x41, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x37, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, - 0x4d, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x44, 0x12, 0x29, 0x0a, 0x25, 0x42, - 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, - 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x45, - 0x4e, 0x44, 0x45, 0x44, 0x10, 0x45, 0x12, 0x27, 0x0a, 0x23, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, - 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x46, 0x12, - 0x2e, 0x0a, 0x2a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x45, 0x5f, 0x4a, 0x4f, 0x49, 0x4e, 0x45, 0x44, - 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x47, 0x12, - 0x28, 0x0a, 0x24, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, - 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4b, 0x10, 0x48, 0x12, 0x32, 0x0a, 0x2e, 0x42, 0x55, 0x53, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, - 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x47, - 0x52, 0x41, 0x4d, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x49, 0x12, 0x32, 0x0a, - 0x2e, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, - 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, - 0x4a, 0x12, 0x30, 0x0a, 0x2c, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, - 0x55, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x45, 0x4e, 0x44, 0x45, - 0x44, 0x10, 0x4b, 0x12, 0x2d, 0x0a, 0x29, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x53, - 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, - 0x10, 0x4c, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x4d, 0x12, 0x30, 0x0a, 0x2c, - 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, - 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x4e, 0x12, 0x25, - 0x0a, 0x21, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, - 0x54, 0x45, 0x44, 0x10, 0x4f, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, - 0x50, 0x41, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x53, 0x10, 0x50, 0x12, 0x34, 0x0a, 0x30, 0x42, 0x55, - 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x49, - 0x44, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x53, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x51, - 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x56, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x55, 0x4d, 0x4d, 0x41, - 0x52, 0x59, 0x10, 0x52, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, - 0x46, 0x45, 0x45, 0x53, 0x5f, 0x50, 0x41, 0x49, 0x44, 0x10, 0x53, 0x12, 0x31, 0x0a, 0x2d, 0x42, + 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x45, 0x53, 0x53, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, + 0x52, 0x53, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x38, 0x12, 0x21, 0x0a, 0x1d, 0x42, + 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, + 0x50, 0x49, 0x52, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x10, 0x39, 0x12, 0x27, + 0x0a, 0x23, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x45, 0x53, 0x53, 0x45, 0x44, 0x5f, 0x50, 0x4f, 0x53, 0x49, + 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x3a, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x53, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x50, 0x4f, 0x54, 0x5f, 0x4c, + 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, + 0x4f, 0x4e, 0x10, 0x3b, 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x4f, 0x52, 0x44, 0x45, + 0x52, 0x10, 0x3c, 0x12, 0x21, 0x0a, 0x1d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x45, + 0x52, 0x49, 0x4f, 0x44, 0x10, 0x3d, 0x12, 0x2c, 0x0a, 0x28, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, + 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x50, 0x4f, 0x49, + 0x4e, 0x54, 0x10, 0x3e, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x43, 0x52, 0x45, 0x41, + 0x54, 0x45, 0x44, 0x10, 0x3f, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x55, 0x50, 0x44, + 0x41, 0x54, 0x45, 0x44, 0x10, 0x40, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x45, + 0x5f, 0x53, 0x57, 0x49, 0x54, 0x43, 0x48, 0x45, 0x44, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, 0x41, + 0x12, 0x26, 0x0a, 0x22, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x45, 0x5f, 0x4a, 0x4f, 0x49, 0x4e, 0x45, + 0x44, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, 0x42, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x53, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, + 0x52, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x53, 0x54, 0x41, 0x52, + 0x54, 0x45, 0x44, 0x10, 0x43, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, + 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, + 0x10, 0x44, 0x12, 0x29, 0x0a, 0x25, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x50, 0x52, + 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x45, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x45, 0x12, 0x27, 0x0a, + 0x23, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x5f, 0x43, 0x52, 0x45, + 0x41, 0x54, 0x45, 0x44, 0x10, 0x46, 0x12, 0x2e, 0x0a, 0x2a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x45, + 0x5f, 0x4a, 0x4f, 0x49, 0x4e, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, + 0x5f, 0x53, 0x45, 0x54, 0x10, 0x47, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4b, 0x10, 0x48, + 0x12, 0x32, 0x0a, 0x2e, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x55, + 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, + 0x45, 0x44, 0x10, 0x49, 0x12, 0x32, 0x0a, 0x2e, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x44, 0x49, + 0x53, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x5f, 0x55, + 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x4a, 0x12, 0x30, 0x0a, 0x2c, 0x42, 0x55, 0x53, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, + 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, + 0x41, 0x4d, 0x5f, 0x45, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x4b, 0x12, 0x2d, 0x0a, 0x29, 0x42, 0x55, + 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, + 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, + 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x4c, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x55, 0x53, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x45, 0x53, 0x54, + 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, + 0x44, 0x10, 0x4d, 0x12, 0x30, 0x0a, 0x2c, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, + 0x54, 0x45, 0x44, 0x10, 0x4e, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x4f, 0x12, 0x23, 0x0a, 0x1f, + 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, + 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x41, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x53, 0x10, + 0x50, 0x12, 0x34, 0x0a, 0x30, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x49, 0x44, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, + 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, + 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x51, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x55, 0x53, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x45, 0x53, 0x54, 0x49, 0x4e, + 0x47, 0x5f, 0x53, 0x55, 0x4d, 0x4d, 0x41, 0x52, 0x59, 0x10, 0x52, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, - 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x43, - 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x54, 0x12, 0x2c, - 0x0a, 0x28, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4d, 0x4f, - 0x44, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x55, 0x12, 0x28, 0x0a, 0x24, - 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, - 0x41, 0x52, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x55, 0x50, 0x44, - 0x41, 0x54, 0x45, 0x44, 0x10, 0x56, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x53, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x57, 0x12, 0x3a, - 0x0a, 0x36, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x57, 0x45, 0x49, 0x47, 0x48, 0x54, 0x45, 0x44, 0x5f, 0x4e, - 0x4f, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x58, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x55, - 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4e, - 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x10, 0x59, 0x12, - 0x19, 0x0a, 0x15, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x65, 0x12, 0x1c, 0x0a, 0x17, 0x42, 0x55, - 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x58, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0xc9, 0x01, 0x42, 0x31, 0x5a, 0x2f, 0x63, 0x6f, 0x64, 0x65, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, - 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, - 0x61, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x50, 0x41, 0x49, 0x44, + 0x10, 0x53, 0x12, 0x31, 0x0a, 0x2d, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x46, 0x45, + 0x45, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, + 0x54, 0x45, 0x44, 0x10, 0x54, 0x12, 0x2c, 0x0a, 0x28, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x4d, 0x41, + 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, + 0x44, 0x10, 0x55, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x46, + 0x49, 0x4c, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x56, 0x12, 0x26, 0x0a, + 0x22, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x54, 0x45, 0x41, 0x4d, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, + 0x54, 0x45, 0x44, 0x10, 0x57, 0x12, 0x3a, 0x0a, 0x36, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x57, 0x45, 0x49, + 0x47, 0x48, 0x54, 0x45, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x5f, 0x50, + 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, + 0x58, 0x12, 0x23, 0x0a, 0x1f, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x5f, 0x4f, 0x52, + 0x44, 0x45, 0x52, 0x53, 0x10, 0x59, 0x12, 0x1b, 0x0a, 0x17, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4d, 0x4d, 0x5f, 0x50, 0x4f, 0x4f, + 0x4c, 0x10, 0x5a, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x65, 0x12, 0x1c, + 0x0a, 0x17, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x54, 0x58, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0xc9, 0x01, 0x42, 0x31, 0x5a, 0x2f, + 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x76, 0x31, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -11716,356 +12191,370 @@ func file_vega_events_v1_events_proto_rawDescGZIP() []byte { return file_vega_events_v1_events_proto_rawDescData } -var file_vega_events_v1_events_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_vega_events_v1_events_proto_msgTypes = make([]protoimpl.MessageInfo, 90) +var file_vega_events_v1_events_proto_enumTypes = make([]protoimpl.EnumInfo, 9) +var file_vega_events_v1_events_proto_msgTypes = make([]protoimpl.MessageInfo, 92) var file_vega_events_v1_events_proto_goTypes = []interface{}{ - (ProtocolUpgradeProposalStatus)(0), // 0: vega.events.v1.ProtocolUpgradeProposalStatus - (BusEventType)(0), // 1: vega.events.v1.BusEventType - (FundingPeriodDataPoint_Source)(0), // 2: vega.events.v1.FundingPeriodDataPoint.Source - (Transfer_Status)(0), // 3: vega.events.v1.Transfer.Status - (StakeLinking_Type)(0), // 4: vega.events.v1.StakeLinking.Type - (StakeLinking_Status)(0), // 5: vega.events.v1.StakeLinking.Status - (ERC20MultiSigSignerEvent_Type)(0), // 6: vega.events.v1.ERC20MultiSigSignerEvent.Type - (*TimeWeightedNotionalPositionUpdated)(nil), // 7: vega.events.v1.TimeWeightedNotionalPositionUpdated - (*VestingBalancesSummary)(nil), // 8: vega.events.v1.VestingBalancesSummary - (*PartyVestingSummary)(nil), // 9: vega.events.v1.PartyVestingSummary - (*PartyLockedBalance)(nil), // 10: vega.events.v1.PartyLockedBalance - (*PartyVestingBalance)(nil), // 11: vega.events.v1.PartyVestingBalance - (*VolumeDiscountStatsUpdated)(nil), // 12: vega.events.v1.VolumeDiscountStatsUpdated - (*PartyVolumeDiscountStats)(nil), // 13: vega.events.v1.PartyVolumeDiscountStats - (*VestingStatsUpdated)(nil), // 14: vega.events.v1.VestingStatsUpdated - (*PartyVestingStats)(nil), // 15: vega.events.v1.PartyVestingStats - (*FeesStats)(nil), // 16: vega.events.v1.FeesStats - (*ReferrerRewardsGenerated)(nil), // 17: vega.events.v1.ReferrerRewardsGenerated - (*MakerFeesGenerated)(nil), // 18: vega.events.v1.MakerFeesGenerated - (*PartyAmount)(nil), // 19: vega.events.v1.PartyAmount - (*PartyActivityStreak)(nil), // 20: vega.events.v1.PartyActivityStreak - (*FundingPeriod)(nil), // 21: vega.events.v1.FundingPeriod - (*FundingPayment)(nil), // 22: vega.events.v1.FundingPayment - (*FundingPayments)(nil), // 23: vega.events.v1.FundingPayments - (*FundingPeriodDataPoint)(nil), // 24: vega.events.v1.FundingPeriodDataPoint - (*StopOrderEvent)(nil), // 25: vega.events.v1.StopOrderEvent - (*ERC20MultiSigSignerAdded)(nil), // 26: vega.events.v1.ERC20MultiSigSignerAdded - (*ERC20MultiSigSignerRemovedSubmitter)(nil), // 27: vega.events.v1.ERC20MultiSigSignerRemovedSubmitter - (*ERC20MultiSigSignerRemoved)(nil), // 28: vega.events.v1.ERC20MultiSigSignerRemoved - (*Transfer)(nil), // 29: vega.events.v1.Transfer - (*OneOffGovernanceTransfer)(nil), // 30: vega.events.v1.OneOffGovernanceTransfer - (*OneOffTransfer)(nil), // 31: vega.events.v1.OneOffTransfer - (*RecurringTransfer)(nil), // 32: vega.events.v1.RecurringTransfer - (*RecurringGovernanceTransfer)(nil), // 33: vega.events.v1.RecurringGovernanceTransfer - (*StakeLinking)(nil), // 34: vega.events.v1.StakeLinking - (*ERC20MultiSigSignerEvent)(nil), // 35: vega.events.v1.ERC20MultiSigSignerEvent - (*ERC20MultiSigThresholdSetEvent)(nil), // 36: vega.events.v1.ERC20MultiSigThresholdSetEvent - (*CheckpointEvent)(nil), // 37: vega.events.v1.CheckpointEvent - (*StreamStartEvent)(nil), // 38: vega.events.v1.StreamStartEvent - (*RewardPayoutEvent)(nil), // 39: vega.events.v1.RewardPayoutEvent - (*ValidatorScoreEvent)(nil), // 40: vega.events.v1.ValidatorScoreEvent - (*DelegationBalanceEvent)(nil), // 41: vega.events.v1.DelegationBalanceEvent - (*MarketEvent)(nil), // 42: vega.events.v1.MarketEvent - (*TransferFees)(nil), // 43: vega.events.v1.TransferFees - (*TransferFeesDiscount)(nil), // 44: vega.events.v1.TransferFeesDiscount - (*TransactionResult)(nil), // 45: vega.events.v1.TransactionResult - (*TxErrorEvent)(nil), // 46: vega.events.v1.TxErrorEvent - (*TimeUpdate)(nil), // 47: vega.events.v1.TimeUpdate - (*EpochEvent)(nil), // 48: vega.events.v1.EpochEvent - (*LedgerMovements)(nil), // 49: vega.events.v1.LedgerMovements - (*PositionResolution)(nil), // 50: vega.events.v1.PositionResolution - (*LossSocialization)(nil), // 51: vega.events.v1.LossSocialization - (*TradeSettlement)(nil), // 52: vega.events.v1.TradeSettlement - (*SettlePosition)(nil), // 53: vega.events.v1.SettlePosition - (*SettleMarket)(nil), // 54: vega.events.v1.SettleMarket - (*PositionStateEvent)(nil), // 55: vega.events.v1.PositionStateEvent - (*SettleDistressed)(nil), // 56: vega.events.v1.SettleDistressed - (*DistressedOrders)(nil), // 57: vega.events.v1.DistressedOrders - (*DistressedPositions)(nil), // 58: vega.events.v1.DistressedPositions - (*MarketTick)(nil), // 59: vega.events.v1.MarketTick - (*AuctionEvent)(nil), // 60: vega.events.v1.AuctionEvent - (*ValidatorUpdate)(nil), // 61: vega.events.v1.ValidatorUpdate - (*ValidatorRankingEvent)(nil), // 62: vega.events.v1.ValidatorRankingEvent - (*KeyRotation)(nil), // 63: vega.events.v1.KeyRotation - (*EthereumKeyRotation)(nil), // 64: vega.events.v1.EthereumKeyRotation - (*ProtocolUpgradeEvent)(nil), // 65: vega.events.v1.ProtocolUpgradeEvent - (*StateVar)(nil), // 66: vega.events.v1.StateVar - (*BeginBlock)(nil), // 67: vega.events.v1.BeginBlock - (*EndBlock)(nil), // 68: vega.events.v1.EndBlock - (*ProtocolUpgradeStarted)(nil), // 69: vega.events.v1.ProtocolUpgradeStarted - (*ProtocolUpgradeDataNodeReady)(nil), // 70: vega.events.v1.ProtocolUpgradeDataNodeReady - (*CoreSnapshotData)(nil), // 71: vega.events.v1.CoreSnapshotData - (*ExpiredOrders)(nil), // 72: vega.events.v1.ExpiredOrders - (*CancelledOrders)(nil), // 73: vega.events.v1.CancelledOrders - (*TeamCreated)(nil), // 74: vega.events.v1.TeamCreated - (*TeamUpdated)(nil), // 75: vega.events.v1.TeamUpdated - (*RefereeSwitchedTeam)(nil), // 76: vega.events.v1.RefereeSwitchedTeam - (*RefereeJoinedTeam)(nil), // 77: vega.events.v1.RefereeJoinedTeam - (*ReferralSetCreated)(nil), // 78: vega.events.v1.ReferralSetCreated - (*ReferralSetStatsUpdated)(nil), // 79: vega.events.v1.ReferralSetStatsUpdated - (*RefereeStats)(nil), // 80: vega.events.v1.RefereeStats - (*RefereeJoinedReferralSet)(nil), // 81: vega.events.v1.RefereeJoinedReferralSet - (*ReferralProgramStarted)(nil), // 82: vega.events.v1.ReferralProgramStarted - (*ReferralProgramUpdated)(nil), // 83: vega.events.v1.ReferralProgramUpdated - (*ReferralProgramEnded)(nil), // 84: vega.events.v1.ReferralProgramEnded - (*VolumeDiscountProgramStarted)(nil), // 85: vega.events.v1.VolumeDiscountProgramStarted - (*VolumeDiscountProgramUpdated)(nil), // 86: vega.events.v1.VolumeDiscountProgramUpdated - (*VolumeDiscountProgramEnded)(nil), // 87: vega.events.v1.VolumeDiscountProgramEnded - (*PaidLiquidityFeesStats)(nil), // 88: vega.events.v1.PaidLiquidityFeesStats - (*PartyMarginModeUpdated)(nil), // 89: vega.events.v1.PartyMarginModeUpdated - (*PartyProfileUpdated)(nil), // 90: vega.events.v1.PartyProfileUpdated - (*TeamsStatsUpdated)(nil), // 91: vega.events.v1.TeamsStatsUpdated - (*TeamStats)(nil), // 92: vega.events.v1.TeamStats - (*TeamMemberStats)(nil), // 93: vega.events.v1.TeamMemberStats - (*BusEvent)(nil), // 94: vega.events.v1.BusEvent - (*TransactionResult_SuccessDetails)(nil), // 95: vega.events.v1.TransactionResult.SuccessDetails - (*TransactionResult_FailureDetails)(nil), // 96: vega.events.v1.TransactionResult.FailureDetails - (*v1.OrderSubmission)(nil), // 97: vega.commands.v1.OrderSubmission - (*vega.StopOrder)(nil), // 98: vega.StopOrder - (vega.AccountType)(0), // 99: vega.AccountType - (*vega.DispatchStrategy)(nil), // 100: vega.DispatchStrategy - (*v1.OrderAmendment)(nil), // 101: vega.commands.v1.OrderAmendment - (*v1.OrderCancellation)(nil), // 102: vega.commands.v1.OrderCancellation - (*v1.ProposalSubmission)(nil), // 103: vega.commands.v1.ProposalSubmission - (*v1.VoteSubmission)(nil), // 104: vega.commands.v1.VoteSubmission - (*v1.LiquidityProvisionSubmission)(nil), // 105: vega.commands.v1.LiquidityProvisionSubmission - (*v1.WithdrawSubmission)(nil), // 106: vega.commands.v1.WithdrawSubmission - (*v1.DelegateSubmission)(nil), // 107: vega.commands.v1.DelegateSubmission - (*v1.UndelegateSubmission)(nil), // 108: vega.commands.v1.UndelegateSubmission - (*v1.LiquidityProvisionCancellation)(nil), // 109: vega.commands.v1.LiquidityProvisionCancellation - (*v1.LiquidityProvisionAmendment)(nil), // 110: vega.commands.v1.LiquidityProvisionAmendment - (*v1.Transfer)(nil), // 111: vega.commands.v1.Transfer - (*v1.CancelTransfer)(nil), // 112: vega.commands.v1.CancelTransfer - (*v1.AnnounceNode)(nil), // 113: vega.commands.v1.AnnounceNode - (*v1.OracleDataSubmission)(nil), // 114: vega.commands.v1.OracleDataSubmission - (*v1.ProtocolUpgradeProposal)(nil), // 115: vega.commands.v1.ProtocolUpgradeProposal - (*v1.IssueSignatures)(nil), // 116: vega.commands.v1.IssueSignatures - (*v1.BatchMarketInstructions)(nil), // 117: vega.commands.v1.BatchMarketInstructions - (*v1.KeyRotateSubmission)(nil), // 118: vega.commands.v1.KeyRotateSubmission - (*v1.EthereumKeyRotateSubmission)(nil), // 119: vega.commands.v1.EthereumKeyRotateSubmission - (*v1.StopOrdersSubmission)(nil), // 120: vega.commands.v1.StopOrdersSubmission - (*v1.StopOrdersCancellation)(nil), // 121: vega.commands.v1.StopOrdersCancellation - (*v1.CreateReferralSet)(nil), // 122: vega.commands.v1.CreateReferralSet - (*v1.UpdateReferralSet)(nil), // 123: vega.commands.v1.UpdateReferralSet - (*v1.ApplyReferralCode)(nil), // 124: vega.commands.v1.ApplyReferralCode - (*v1.UpdateMarginMode)(nil), // 125: vega.commands.v1.UpdateMarginMode - (*v1.JoinTeam)(nil), // 126: vega.commands.v1.JoinTeam - (*v1.BatchProposalSubmission)(nil), // 127: vega.commands.v1.BatchProposalSubmission - (*v1.UpdatePartyProfile)(nil), // 128: vega.commands.v1.UpdatePartyProfile - (vega.EpochAction)(0), // 129: vega.EpochAction - (*vega.LedgerMovement)(nil), // 130: vega.LedgerMovement - (vega.AuctionTrigger)(0), // 131: vega.AuctionTrigger - (*vega.ReferralProgram)(nil), // 132: vega.ReferralProgram - (*vega.VolumeDiscountProgram)(nil), // 133: vega.VolumeDiscountProgram - (vega.MarginMode)(0), // 134: vega.MarginMode - (*vega.PartyProfile)(nil), // 135: vega.PartyProfile - (*vega.Order)(nil), // 136: vega.Order - (*vega.Account)(nil), // 137: vega.Account - (*vega.Party)(nil), // 138: vega.Party - (*vega.Trade)(nil), // 139: vega.Trade - (*vega.MarginLevels)(nil), // 140: vega.MarginLevels - (*vega.Proposal)(nil), // 141: vega.Proposal - (*vega.Vote)(nil), // 142: vega.Vote - (*vega.MarketData)(nil), // 143: vega.MarketData - (*v1.NodeSignature)(nil), // 144: vega.commands.v1.NodeSignature - (*vega.Market)(nil), // 145: vega.Market - (*vega.Asset)(nil), // 146: vega.Asset - (*vega.Withdrawal)(nil), // 147: vega.Withdrawal - (*vega.Deposit)(nil), // 148: vega.Deposit - (*vega.RiskFactor)(nil), // 149: vega.RiskFactor - (*vega.NetworkParameter)(nil), // 150: vega.NetworkParameter - (*vega.LiquidityProvision)(nil), // 151: vega.LiquidityProvision - (*vega.OracleSpec)(nil), // 152: vega.OracleSpec - (*vega.OracleData)(nil), // 153: vega.OracleData - (*vega.NetworkLimits)(nil), // 154: vega.NetworkLimits + (ProtocolUpgradeProposalStatus)(0), // 0: vega.events.v1.ProtocolUpgradeProposalStatus + (BusEventType)(0), // 1: vega.events.v1.BusEventType + (AMMPool_Status)(0), // 2: vega.events.v1.AMMPool.Status + (AMMPool_StatusReason)(0), // 3: vega.events.v1.AMMPool.StatusReason + (FundingPeriodDataPoint_Source)(0), // 4: vega.events.v1.FundingPeriodDataPoint.Source + (Transfer_Status)(0), // 5: vega.events.v1.Transfer.Status + (StakeLinking_Type)(0), // 6: vega.events.v1.StakeLinking.Type + (StakeLinking_Status)(0), // 7: vega.events.v1.StakeLinking.Status + (ERC20MultiSigSignerEvent_Type)(0), // 8: vega.events.v1.ERC20MultiSigSignerEvent.Type + (*TimeWeightedNotionalPositionUpdated)(nil), // 9: vega.events.v1.TimeWeightedNotionalPositionUpdated + (*AMMPool)(nil), // 10: vega.events.v1.AMMPool + (*VestingBalancesSummary)(nil), // 11: vega.events.v1.VestingBalancesSummary + (*PartyVestingSummary)(nil), // 12: vega.events.v1.PartyVestingSummary + (*PartyLockedBalance)(nil), // 13: vega.events.v1.PartyLockedBalance + (*PartyVestingBalance)(nil), // 14: vega.events.v1.PartyVestingBalance + (*VolumeDiscountStatsUpdated)(nil), // 15: vega.events.v1.VolumeDiscountStatsUpdated + (*PartyVolumeDiscountStats)(nil), // 16: vega.events.v1.PartyVolumeDiscountStats + (*VestingStatsUpdated)(nil), // 17: vega.events.v1.VestingStatsUpdated + (*PartyVestingStats)(nil), // 18: vega.events.v1.PartyVestingStats + (*FeesStats)(nil), // 19: vega.events.v1.FeesStats + (*ReferrerRewardsGenerated)(nil), // 20: vega.events.v1.ReferrerRewardsGenerated + (*MakerFeesGenerated)(nil), // 21: vega.events.v1.MakerFeesGenerated + (*PartyAmount)(nil), // 22: vega.events.v1.PartyAmount + (*PartyActivityStreak)(nil), // 23: vega.events.v1.PartyActivityStreak + (*FundingPeriod)(nil), // 24: vega.events.v1.FundingPeriod + (*FundingPayment)(nil), // 25: vega.events.v1.FundingPayment + (*FundingPayments)(nil), // 26: vega.events.v1.FundingPayments + (*FundingPeriodDataPoint)(nil), // 27: vega.events.v1.FundingPeriodDataPoint + (*StopOrderEvent)(nil), // 28: vega.events.v1.StopOrderEvent + (*ERC20MultiSigSignerAdded)(nil), // 29: vega.events.v1.ERC20MultiSigSignerAdded + (*ERC20MultiSigSignerRemovedSubmitter)(nil), // 30: vega.events.v1.ERC20MultiSigSignerRemovedSubmitter + (*ERC20MultiSigSignerRemoved)(nil), // 31: vega.events.v1.ERC20MultiSigSignerRemoved + (*Transfer)(nil), // 32: vega.events.v1.Transfer + (*OneOffGovernanceTransfer)(nil), // 33: vega.events.v1.OneOffGovernanceTransfer + (*OneOffTransfer)(nil), // 34: vega.events.v1.OneOffTransfer + (*RecurringTransfer)(nil), // 35: vega.events.v1.RecurringTransfer + (*RecurringGovernanceTransfer)(nil), // 36: vega.events.v1.RecurringGovernanceTransfer + (*StakeLinking)(nil), // 37: vega.events.v1.StakeLinking + (*ERC20MultiSigSignerEvent)(nil), // 38: vega.events.v1.ERC20MultiSigSignerEvent + (*ERC20MultiSigThresholdSetEvent)(nil), // 39: vega.events.v1.ERC20MultiSigThresholdSetEvent + (*CheckpointEvent)(nil), // 40: vega.events.v1.CheckpointEvent + (*StreamStartEvent)(nil), // 41: vega.events.v1.StreamStartEvent + (*RewardPayoutEvent)(nil), // 42: vega.events.v1.RewardPayoutEvent + (*ValidatorScoreEvent)(nil), // 43: vega.events.v1.ValidatorScoreEvent + (*DelegationBalanceEvent)(nil), // 44: vega.events.v1.DelegationBalanceEvent + (*MarketEvent)(nil), // 45: vega.events.v1.MarketEvent + (*TransferFees)(nil), // 46: vega.events.v1.TransferFees + (*TransferFeesDiscount)(nil), // 47: vega.events.v1.TransferFeesDiscount + (*TransactionResult)(nil), // 48: vega.events.v1.TransactionResult + (*TxErrorEvent)(nil), // 49: vega.events.v1.TxErrorEvent + (*TimeUpdate)(nil), // 50: vega.events.v1.TimeUpdate + (*EpochEvent)(nil), // 51: vega.events.v1.EpochEvent + (*LedgerMovements)(nil), // 52: vega.events.v1.LedgerMovements + (*PositionResolution)(nil), // 53: vega.events.v1.PositionResolution + (*LossSocialization)(nil), // 54: vega.events.v1.LossSocialization + (*TradeSettlement)(nil), // 55: vega.events.v1.TradeSettlement + (*SettlePosition)(nil), // 56: vega.events.v1.SettlePosition + (*SettleMarket)(nil), // 57: vega.events.v1.SettleMarket + (*PositionStateEvent)(nil), // 58: vega.events.v1.PositionStateEvent + (*SettleDistressed)(nil), // 59: vega.events.v1.SettleDistressed + (*DistressedOrders)(nil), // 60: vega.events.v1.DistressedOrders + (*DistressedPositions)(nil), // 61: vega.events.v1.DistressedPositions + (*MarketTick)(nil), // 62: vega.events.v1.MarketTick + (*AuctionEvent)(nil), // 63: vega.events.v1.AuctionEvent + (*ValidatorUpdate)(nil), // 64: vega.events.v1.ValidatorUpdate + (*ValidatorRankingEvent)(nil), // 65: vega.events.v1.ValidatorRankingEvent + (*KeyRotation)(nil), // 66: vega.events.v1.KeyRotation + (*EthereumKeyRotation)(nil), // 67: vega.events.v1.EthereumKeyRotation + (*ProtocolUpgradeEvent)(nil), // 68: vega.events.v1.ProtocolUpgradeEvent + (*StateVar)(nil), // 69: vega.events.v1.StateVar + (*BeginBlock)(nil), // 70: vega.events.v1.BeginBlock + (*EndBlock)(nil), // 71: vega.events.v1.EndBlock + (*ProtocolUpgradeStarted)(nil), // 72: vega.events.v1.ProtocolUpgradeStarted + (*ProtocolUpgradeDataNodeReady)(nil), // 73: vega.events.v1.ProtocolUpgradeDataNodeReady + (*CoreSnapshotData)(nil), // 74: vega.events.v1.CoreSnapshotData + (*ExpiredOrders)(nil), // 75: vega.events.v1.ExpiredOrders + (*CancelledOrders)(nil), // 76: vega.events.v1.CancelledOrders + (*TeamCreated)(nil), // 77: vega.events.v1.TeamCreated + (*TeamUpdated)(nil), // 78: vega.events.v1.TeamUpdated + (*RefereeSwitchedTeam)(nil), // 79: vega.events.v1.RefereeSwitchedTeam + (*RefereeJoinedTeam)(nil), // 80: vega.events.v1.RefereeJoinedTeam + (*ReferralSetCreated)(nil), // 81: vega.events.v1.ReferralSetCreated + (*ReferralSetStatsUpdated)(nil), // 82: vega.events.v1.ReferralSetStatsUpdated + (*RefereeStats)(nil), // 83: vega.events.v1.RefereeStats + (*RefereeJoinedReferralSet)(nil), // 84: vega.events.v1.RefereeJoinedReferralSet + (*ReferralProgramStarted)(nil), // 85: vega.events.v1.ReferralProgramStarted + (*ReferralProgramUpdated)(nil), // 86: vega.events.v1.ReferralProgramUpdated + (*ReferralProgramEnded)(nil), // 87: vega.events.v1.ReferralProgramEnded + (*VolumeDiscountProgramStarted)(nil), // 88: vega.events.v1.VolumeDiscountProgramStarted + (*VolumeDiscountProgramUpdated)(nil), // 89: vega.events.v1.VolumeDiscountProgramUpdated + (*VolumeDiscountProgramEnded)(nil), // 90: vega.events.v1.VolumeDiscountProgramEnded + (*PaidLiquidityFeesStats)(nil), // 91: vega.events.v1.PaidLiquidityFeesStats + (*PartyMarginModeUpdated)(nil), // 92: vega.events.v1.PartyMarginModeUpdated + (*PartyProfileUpdated)(nil), // 93: vega.events.v1.PartyProfileUpdated + (*TeamsStatsUpdated)(nil), // 94: vega.events.v1.TeamsStatsUpdated + (*TeamStats)(nil), // 95: vega.events.v1.TeamStats + (*TeamMemberStats)(nil), // 96: vega.events.v1.TeamMemberStats + (*BusEvent)(nil), // 97: vega.events.v1.BusEvent + (*AMMPool_ConcentratedLiquidityParameters)(nil), // 98: vega.events.v1.AMMPool.ConcentratedLiquidityParameters + (*TransactionResult_SuccessDetails)(nil), // 99: vega.events.v1.TransactionResult.SuccessDetails + (*TransactionResult_FailureDetails)(nil), // 100: vega.events.v1.TransactionResult.FailureDetails + (*v1.OrderSubmission)(nil), // 101: vega.commands.v1.OrderSubmission + (*vega.StopOrder)(nil), // 102: vega.StopOrder + (vega.AccountType)(0), // 103: vega.AccountType + (*vega.DispatchStrategy)(nil), // 104: vega.DispatchStrategy + (*v1.OrderAmendment)(nil), // 105: vega.commands.v1.OrderAmendment + (*v1.OrderCancellation)(nil), // 106: vega.commands.v1.OrderCancellation + (*v1.ProposalSubmission)(nil), // 107: vega.commands.v1.ProposalSubmission + (*v1.VoteSubmission)(nil), // 108: vega.commands.v1.VoteSubmission + (*v1.LiquidityProvisionSubmission)(nil), // 109: vega.commands.v1.LiquidityProvisionSubmission + (*v1.WithdrawSubmission)(nil), // 110: vega.commands.v1.WithdrawSubmission + (*v1.DelegateSubmission)(nil), // 111: vega.commands.v1.DelegateSubmission + (*v1.UndelegateSubmission)(nil), // 112: vega.commands.v1.UndelegateSubmission + (*v1.LiquidityProvisionCancellation)(nil), // 113: vega.commands.v1.LiquidityProvisionCancellation + (*v1.LiquidityProvisionAmendment)(nil), // 114: vega.commands.v1.LiquidityProvisionAmendment + (*v1.Transfer)(nil), // 115: vega.commands.v1.Transfer + (*v1.CancelTransfer)(nil), // 116: vega.commands.v1.CancelTransfer + (*v1.AnnounceNode)(nil), // 117: vega.commands.v1.AnnounceNode + (*v1.OracleDataSubmission)(nil), // 118: vega.commands.v1.OracleDataSubmission + (*v1.ProtocolUpgradeProposal)(nil), // 119: vega.commands.v1.ProtocolUpgradeProposal + (*v1.IssueSignatures)(nil), // 120: vega.commands.v1.IssueSignatures + (*v1.BatchMarketInstructions)(nil), // 121: vega.commands.v1.BatchMarketInstructions + (*v1.KeyRotateSubmission)(nil), // 122: vega.commands.v1.KeyRotateSubmission + (*v1.EthereumKeyRotateSubmission)(nil), // 123: vega.commands.v1.EthereumKeyRotateSubmission + (*v1.StopOrdersSubmission)(nil), // 124: vega.commands.v1.StopOrdersSubmission + (*v1.StopOrdersCancellation)(nil), // 125: vega.commands.v1.StopOrdersCancellation + (*v1.CreateReferralSet)(nil), // 126: vega.commands.v1.CreateReferralSet + (*v1.UpdateReferralSet)(nil), // 127: vega.commands.v1.UpdateReferralSet + (*v1.ApplyReferralCode)(nil), // 128: vega.commands.v1.ApplyReferralCode + (*v1.UpdateMarginMode)(nil), // 129: vega.commands.v1.UpdateMarginMode + (*v1.JoinTeam)(nil), // 130: vega.commands.v1.JoinTeam + (*v1.BatchProposalSubmission)(nil), // 131: vega.commands.v1.BatchProposalSubmission + (*v1.UpdatePartyProfile)(nil), // 132: vega.commands.v1.UpdatePartyProfile + (*v1.SubmitAMM)(nil), // 133: vega.commands.v1.SubmitAMM + (*v1.AmendAMM)(nil), // 134: vega.commands.v1.AmendAMM + (*v1.CancelAMM)(nil), // 135: vega.commands.v1.CancelAMM + (vega.EpochAction)(0), // 136: vega.EpochAction + (*vega.LedgerMovement)(nil), // 137: vega.LedgerMovement + (vega.AuctionTrigger)(0), // 138: vega.AuctionTrigger + (*vega.ReferralProgram)(nil), // 139: vega.ReferralProgram + (*vega.VolumeDiscountProgram)(nil), // 140: vega.VolumeDiscountProgram + (vega.MarginMode)(0), // 141: vega.MarginMode + (*vega.PartyProfile)(nil), // 142: vega.PartyProfile + (*vega.Order)(nil), // 143: vega.Order + (*vega.Account)(nil), // 144: vega.Account + (*vega.Party)(nil), // 145: vega.Party + (*vega.Trade)(nil), // 146: vega.Trade + (*vega.MarginLevels)(nil), // 147: vega.MarginLevels + (*vega.Proposal)(nil), // 148: vega.Proposal + (*vega.Vote)(nil), // 149: vega.Vote + (*vega.MarketData)(nil), // 150: vega.MarketData + (*v1.NodeSignature)(nil), // 151: vega.commands.v1.NodeSignature + (*vega.Market)(nil), // 152: vega.Market + (*vega.Asset)(nil), // 153: vega.Asset + (*vega.Withdrawal)(nil), // 154: vega.Withdrawal + (*vega.Deposit)(nil), // 155: vega.Deposit + (*vega.RiskFactor)(nil), // 156: vega.RiskFactor + (*vega.NetworkParameter)(nil), // 157: vega.NetworkParameter + (*vega.LiquidityProvision)(nil), // 158: vega.LiquidityProvision + (*vega.OracleSpec)(nil), // 159: vega.OracleSpec + (*vega.OracleData)(nil), // 160: vega.OracleData + (*vega.NetworkLimits)(nil), // 161: vega.NetworkLimits } var file_vega_events_v1_events_proto_depIdxs = []int32{ - 9, // 0: vega.events.v1.VestingBalancesSummary.parties_vesting_summary:type_name -> vega.events.v1.PartyVestingSummary - 10, // 1: vega.events.v1.PartyVestingSummary.party_locked_balances:type_name -> vega.events.v1.PartyLockedBalance - 11, // 2: vega.events.v1.PartyVestingSummary.party_vesting_balances:type_name -> vega.events.v1.PartyVestingBalance - 13, // 3: vega.events.v1.VolumeDiscountStatsUpdated.stats:type_name -> vega.events.v1.PartyVolumeDiscountStats - 15, // 4: vega.events.v1.VestingStatsUpdated.stats:type_name -> vega.events.v1.PartyVestingStats - 19, // 5: vega.events.v1.FeesStats.total_rewards_received:type_name -> vega.events.v1.PartyAmount - 17, // 6: vega.events.v1.FeesStats.referrer_rewards_generated:type_name -> vega.events.v1.ReferrerRewardsGenerated - 19, // 7: vega.events.v1.FeesStats.referees_discount_applied:type_name -> vega.events.v1.PartyAmount - 19, // 8: vega.events.v1.FeesStats.volume_discount_applied:type_name -> vega.events.v1.PartyAmount - 19, // 9: vega.events.v1.FeesStats.total_maker_fees_received:type_name -> vega.events.v1.PartyAmount - 18, // 10: vega.events.v1.FeesStats.maker_fees_generated:type_name -> vega.events.v1.MakerFeesGenerated - 19, // 11: vega.events.v1.FeesStats.total_fees_paid_and_received:type_name -> vega.events.v1.PartyAmount - 19, // 12: vega.events.v1.ReferrerRewardsGenerated.generated_reward:type_name -> vega.events.v1.PartyAmount - 19, // 13: vega.events.v1.MakerFeesGenerated.maker_fees_paid:type_name -> vega.events.v1.PartyAmount - 22, // 14: vega.events.v1.FundingPayments.payments:type_name -> vega.events.v1.FundingPayment - 2, // 15: vega.events.v1.FundingPeriodDataPoint.data_point_type:type_name -> vega.events.v1.FundingPeriodDataPoint.Source - 97, // 16: vega.events.v1.StopOrderEvent.submission:type_name -> vega.commands.v1.OrderSubmission - 98, // 17: vega.events.v1.StopOrderEvent.stop_order:type_name -> vega.StopOrder - 27, // 18: vega.events.v1.ERC20MultiSigSignerRemoved.signature_submitters:type_name -> vega.events.v1.ERC20MultiSigSignerRemovedSubmitter - 99, // 19: vega.events.v1.Transfer.from_account_type:type_name -> vega.AccountType - 99, // 20: vega.events.v1.Transfer.to_account_type:type_name -> vega.AccountType - 3, // 21: vega.events.v1.Transfer.status:type_name -> vega.events.v1.Transfer.Status - 31, // 22: vega.events.v1.Transfer.one_off:type_name -> vega.events.v1.OneOffTransfer - 32, // 23: vega.events.v1.Transfer.recurring:type_name -> vega.events.v1.RecurringTransfer - 30, // 24: vega.events.v1.Transfer.one_off_governance:type_name -> vega.events.v1.OneOffGovernanceTransfer - 33, // 25: vega.events.v1.Transfer.recurring_governance:type_name -> vega.events.v1.RecurringGovernanceTransfer - 100, // 26: vega.events.v1.RecurringTransfer.dispatch_strategy:type_name -> vega.DispatchStrategy - 100, // 27: vega.events.v1.RecurringGovernanceTransfer.dispatch_strategy:type_name -> vega.DispatchStrategy - 4, // 28: vega.events.v1.StakeLinking.type:type_name -> vega.events.v1.StakeLinking.Type - 5, // 29: vega.events.v1.StakeLinking.status:type_name -> vega.events.v1.StakeLinking.Status - 6, // 30: vega.events.v1.ERC20MultiSigSignerEvent.type:type_name -> vega.events.v1.ERC20MultiSigSignerEvent.Type - 97, // 31: vega.events.v1.TransactionResult.order_submission:type_name -> vega.commands.v1.OrderSubmission - 101, // 32: vega.events.v1.TransactionResult.order_amendment:type_name -> vega.commands.v1.OrderAmendment - 102, // 33: vega.events.v1.TransactionResult.order_cancellation:type_name -> vega.commands.v1.OrderCancellation - 103, // 34: vega.events.v1.TransactionResult.proposal:type_name -> vega.commands.v1.ProposalSubmission - 104, // 35: vega.events.v1.TransactionResult.vote_submission:type_name -> vega.commands.v1.VoteSubmission - 105, // 36: vega.events.v1.TransactionResult.liquidity_provision_submission:type_name -> vega.commands.v1.LiquidityProvisionSubmission - 106, // 37: vega.events.v1.TransactionResult.withdraw_submission:type_name -> vega.commands.v1.WithdrawSubmission - 107, // 38: vega.events.v1.TransactionResult.delegate_submission:type_name -> vega.commands.v1.DelegateSubmission - 108, // 39: vega.events.v1.TransactionResult.undelegate_submission:type_name -> vega.commands.v1.UndelegateSubmission - 109, // 40: vega.events.v1.TransactionResult.liquidity_provision_cancellation:type_name -> vega.commands.v1.LiquidityProvisionCancellation - 110, // 41: vega.events.v1.TransactionResult.liquidity_provision_amendment:type_name -> vega.commands.v1.LiquidityProvisionAmendment - 111, // 42: vega.events.v1.TransactionResult.transfer:type_name -> vega.commands.v1.Transfer - 112, // 43: vega.events.v1.TransactionResult.cancel_transfer:type_name -> vega.commands.v1.CancelTransfer - 113, // 44: vega.events.v1.TransactionResult.announce_node:type_name -> vega.commands.v1.AnnounceNode - 114, // 45: vega.events.v1.TransactionResult.oracle_data_submission:type_name -> vega.commands.v1.OracleDataSubmission - 115, // 46: vega.events.v1.TransactionResult.protocol_upgrade_proposal:type_name -> vega.commands.v1.ProtocolUpgradeProposal - 116, // 47: vega.events.v1.TransactionResult.issue_signatures:type_name -> vega.commands.v1.IssueSignatures - 117, // 48: vega.events.v1.TransactionResult.batch_market_instructions:type_name -> vega.commands.v1.BatchMarketInstructions - 118, // 49: vega.events.v1.TransactionResult.key_rotate_submission:type_name -> vega.commands.v1.KeyRotateSubmission - 119, // 50: vega.events.v1.TransactionResult.ethereum_key_rotate_submission:type_name -> vega.commands.v1.EthereumKeyRotateSubmission - 120, // 51: vega.events.v1.TransactionResult.stop_orders_submission:type_name -> vega.commands.v1.StopOrdersSubmission - 121, // 52: vega.events.v1.TransactionResult.stop_orders_cancellation:type_name -> vega.commands.v1.StopOrdersCancellation - 122, // 53: vega.events.v1.TransactionResult.create_referral_set:type_name -> vega.commands.v1.CreateReferralSet - 123, // 54: vega.events.v1.TransactionResult.update_referral_set:type_name -> vega.commands.v1.UpdateReferralSet - 124, // 55: vega.events.v1.TransactionResult.apply_referral_code:type_name -> vega.commands.v1.ApplyReferralCode - 125, // 56: vega.events.v1.TransactionResult.update_margin_mode:type_name -> vega.commands.v1.UpdateMarginMode - 126, // 57: vega.events.v1.TransactionResult.join_team:type_name -> vega.commands.v1.JoinTeam - 127, // 58: vega.events.v1.TransactionResult.batch_proposal:type_name -> vega.commands.v1.BatchProposalSubmission - 128, // 59: vega.events.v1.TransactionResult.update_party_profile:type_name -> vega.commands.v1.UpdatePartyProfile - 95, // 60: vega.events.v1.TransactionResult.success:type_name -> vega.events.v1.TransactionResult.SuccessDetails - 96, // 61: vega.events.v1.TransactionResult.failure:type_name -> vega.events.v1.TransactionResult.FailureDetails - 97, // 62: vega.events.v1.TxErrorEvent.order_submission:type_name -> vega.commands.v1.OrderSubmission - 101, // 63: vega.events.v1.TxErrorEvent.order_amendment:type_name -> vega.commands.v1.OrderAmendment - 102, // 64: vega.events.v1.TxErrorEvent.order_cancellation:type_name -> vega.commands.v1.OrderCancellation - 103, // 65: vega.events.v1.TxErrorEvent.proposal:type_name -> vega.commands.v1.ProposalSubmission - 104, // 66: vega.events.v1.TxErrorEvent.vote_submission:type_name -> vega.commands.v1.VoteSubmission - 105, // 67: vega.events.v1.TxErrorEvent.liquidity_provision_submission:type_name -> vega.commands.v1.LiquidityProvisionSubmission - 106, // 68: vega.events.v1.TxErrorEvent.withdraw_submission:type_name -> vega.commands.v1.WithdrawSubmission - 107, // 69: vega.events.v1.TxErrorEvent.delegate_submission:type_name -> vega.commands.v1.DelegateSubmission - 108, // 70: vega.events.v1.TxErrorEvent.undelegate_submission:type_name -> vega.commands.v1.UndelegateSubmission - 109, // 71: vega.events.v1.TxErrorEvent.liquidity_provision_cancellation:type_name -> vega.commands.v1.LiquidityProvisionCancellation - 110, // 72: vega.events.v1.TxErrorEvent.liquidity_provision_amendment:type_name -> vega.commands.v1.LiquidityProvisionAmendment - 111, // 73: vega.events.v1.TxErrorEvent.transfer:type_name -> vega.commands.v1.Transfer - 112, // 74: vega.events.v1.TxErrorEvent.cancel_transfer:type_name -> vega.commands.v1.CancelTransfer - 113, // 75: vega.events.v1.TxErrorEvent.announce_node:type_name -> vega.commands.v1.AnnounceNode - 114, // 76: vega.events.v1.TxErrorEvent.oracle_data_submission:type_name -> vega.commands.v1.OracleDataSubmission - 115, // 77: vega.events.v1.TxErrorEvent.protocol_upgrade_proposal:type_name -> vega.commands.v1.ProtocolUpgradeProposal - 116, // 78: vega.events.v1.TxErrorEvent.issue_signatures:type_name -> vega.commands.v1.IssueSignatures - 117, // 79: vega.events.v1.TxErrorEvent.batch_market_instructions:type_name -> vega.commands.v1.BatchMarketInstructions - 129, // 80: vega.events.v1.EpochEvent.action:type_name -> vega.EpochAction - 130, // 81: vega.events.v1.LedgerMovements.ledger_movements:type_name -> vega.LedgerMovement - 52, // 82: vega.events.v1.SettlePosition.trade_settlements:type_name -> vega.events.v1.TradeSettlement - 131, // 83: vega.events.v1.AuctionEvent.trigger:type_name -> vega.AuctionTrigger - 131, // 84: vega.events.v1.AuctionEvent.extension_trigger:type_name -> vega.AuctionTrigger - 0, // 85: vega.events.v1.ProtocolUpgradeEvent.status:type_name -> vega.events.v1.ProtocolUpgradeProposalStatus - 80, // 86: vega.events.v1.ReferralSetStatsUpdated.referees_stats:type_name -> vega.events.v1.RefereeStats - 132, // 87: vega.events.v1.ReferralProgramStarted.program:type_name -> vega.ReferralProgram - 132, // 88: vega.events.v1.ReferralProgramUpdated.program:type_name -> vega.ReferralProgram - 133, // 89: vega.events.v1.VolumeDiscountProgramStarted.program:type_name -> vega.VolumeDiscountProgram - 133, // 90: vega.events.v1.VolumeDiscountProgramUpdated.program:type_name -> vega.VolumeDiscountProgram - 19, // 91: vega.events.v1.PaidLiquidityFeesStats.fees_paid_per_party:type_name -> vega.events.v1.PartyAmount - 134, // 92: vega.events.v1.PartyMarginModeUpdated.margin_mode:type_name -> vega.MarginMode - 135, // 93: vega.events.v1.PartyProfileUpdated.updated_profile:type_name -> vega.PartyProfile - 92, // 94: vega.events.v1.TeamsStatsUpdated.stats:type_name -> vega.events.v1.TeamStats - 93, // 95: vega.events.v1.TeamStats.members_stats:type_name -> vega.events.v1.TeamMemberStats - 1, // 96: vega.events.v1.BusEvent.type:type_name -> vega.events.v1.BusEventType - 47, // 97: vega.events.v1.BusEvent.time_update:type_name -> vega.events.v1.TimeUpdate - 49, // 98: vega.events.v1.BusEvent.ledger_movements:type_name -> vega.events.v1.LedgerMovements - 50, // 99: vega.events.v1.BusEvent.position_resolution:type_name -> vega.events.v1.PositionResolution - 136, // 100: vega.events.v1.BusEvent.order:type_name -> vega.Order - 137, // 101: vega.events.v1.BusEvent.account:type_name -> vega.Account - 138, // 102: vega.events.v1.BusEvent.party:type_name -> vega.Party - 139, // 103: vega.events.v1.BusEvent.trade:type_name -> vega.Trade - 140, // 104: vega.events.v1.BusEvent.margin_levels:type_name -> vega.MarginLevels - 141, // 105: vega.events.v1.BusEvent.proposal:type_name -> vega.Proposal - 142, // 106: vega.events.v1.BusEvent.vote:type_name -> vega.Vote - 143, // 107: vega.events.v1.BusEvent.market_data:type_name -> vega.MarketData - 144, // 108: vega.events.v1.BusEvent.node_signature:type_name -> vega.commands.v1.NodeSignature - 51, // 109: vega.events.v1.BusEvent.loss_socialization:type_name -> vega.events.v1.LossSocialization - 53, // 110: vega.events.v1.BusEvent.settle_position:type_name -> vega.events.v1.SettlePosition - 56, // 111: vega.events.v1.BusEvent.settle_distressed:type_name -> vega.events.v1.SettleDistressed - 145, // 112: vega.events.v1.BusEvent.market_created:type_name -> vega.Market - 146, // 113: vega.events.v1.BusEvent.asset:type_name -> vega.Asset - 59, // 114: vega.events.v1.BusEvent.market_tick:type_name -> vega.events.v1.MarketTick - 147, // 115: vega.events.v1.BusEvent.withdrawal:type_name -> vega.Withdrawal - 148, // 116: vega.events.v1.BusEvent.deposit:type_name -> vega.Deposit - 60, // 117: vega.events.v1.BusEvent.auction:type_name -> vega.events.v1.AuctionEvent - 149, // 118: vega.events.v1.BusEvent.risk_factor:type_name -> vega.RiskFactor - 150, // 119: vega.events.v1.BusEvent.network_parameter:type_name -> vega.NetworkParameter - 151, // 120: vega.events.v1.BusEvent.liquidity_provision:type_name -> vega.LiquidityProvision - 145, // 121: vega.events.v1.BusEvent.market_updated:type_name -> vega.Market - 152, // 122: vega.events.v1.BusEvent.oracle_spec:type_name -> vega.OracleSpec - 153, // 123: vega.events.v1.BusEvent.oracle_data:type_name -> vega.OracleData - 41, // 124: vega.events.v1.BusEvent.delegation_balance:type_name -> vega.events.v1.DelegationBalanceEvent - 40, // 125: vega.events.v1.BusEvent.validator_score:type_name -> vega.events.v1.ValidatorScoreEvent - 48, // 126: vega.events.v1.BusEvent.epoch_event:type_name -> vega.events.v1.EpochEvent - 61, // 127: vega.events.v1.BusEvent.validator_update:type_name -> vega.events.v1.ValidatorUpdate - 34, // 128: vega.events.v1.BusEvent.stake_linking:type_name -> vega.events.v1.StakeLinking - 39, // 129: vega.events.v1.BusEvent.reward_payout:type_name -> vega.events.v1.RewardPayoutEvent - 37, // 130: vega.events.v1.BusEvent.checkpoint:type_name -> vega.events.v1.CheckpointEvent - 63, // 131: vega.events.v1.BusEvent.key_rotation:type_name -> vega.events.v1.KeyRotation - 66, // 132: vega.events.v1.BusEvent.state_var:type_name -> vega.events.v1.StateVar - 154, // 133: vega.events.v1.BusEvent.network_limits:type_name -> vega.NetworkLimits - 29, // 134: vega.events.v1.BusEvent.transfer:type_name -> vega.events.v1.Transfer - 62, // 135: vega.events.v1.BusEvent.ranking_event:type_name -> vega.events.v1.ValidatorRankingEvent - 35, // 136: vega.events.v1.BusEvent.erc20_multisig_signer_event:type_name -> vega.events.v1.ERC20MultiSigSignerEvent - 36, // 137: vega.events.v1.BusEvent.erc20_multisig_set_threshold_event:type_name -> vega.events.v1.ERC20MultiSigThresholdSetEvent - 26, // 138: vega.events.v1.BusEvent.erc20_multisig_signer_added:type_name -> vega.events.v1.ERC20MultiSigSignerAdded - 28, // 139: vega.events.v1.BusEvent.erc20_multisig_signer_removed:type_name -> vega.events.v1.ERC20MultiSigSignerRemoved - 55, // 140: vega.events.v1.BusEvent.position_state_event:type_name -> vega.events.v1.PositionStateEvent - 64, // 141: vega.events.v1.BusEvent.ethereum_key_rotation:type_name -> vega.events.v1.EthereumKeyRotation - 65, // 142: vega.events.v1.BusEvent.protocol_upgrade_event:type_name -> vega.events.v1.ProtocolUpgradeEvent - 67, // 143: vega.events.v1.BusEvent.begin_block:type_name -> vega.events.v1.BeginBlock - 68, // 144: vega.events.v1.BusEvent.end_block:type_name -> vega.events.v1.EndBlock - 69, // 145: vega.events.v1.BusEvent.protocol_upgrade_started:type_name -> vega.events.v1.ProtocolUpgradeStarted - 54, // 146: vega.events.v1.BusEvent.settle_market:type_name -> vega.events.v1.SettleMarket - 45, // 147: vega.events.v1.BusEvent.transaction_result:type_name -> vega.events.v1.TransactionResult - 71, // 148: vega.events.v1.BusEvent.core_snapshot_event:type_name -> vega.events.v1.CoreSnapshotData - 70, // 149: vega.events.v1.BusEvent.protocol_upgrade_data_node_ready:type_name -> vega.events.v1.ProtocolUpgradeDataNodeReady - 57, // 150: vega.events.v1.BusEvent.distressed_orders:type_name -> vega.events.v1.DistressedOrders - 72, // 151: vega.events.v1.BusEvent.expired_orders:type_name -> vega.events.v1.ExpiredOrders - 58, // 152: vega.events.v1.BusEvent.distressed_positions:type_name -> vega.events.v1.DistressedPositions - 25, // 153: vega.events.v1.BusEvent.stop_order:type_name -> vega.events.v1.StopOrderEvent - 21, // 154: vega.events.v1.BusEvent.funding_period:type_name -> vega.events.v1.FundingPeriod - 24, // 155: vega.events.v1.BusEvent.funding_period_data_point:type_name -> vega.events.v1.FundingPeriodDataPoint - 74, // 156: vega.events.v1.BusEvent.team_created:type_name -> vega.events.v1.TeamCreated - 75, // 157: vega.events.v1.BusEvent.team_updated:type_name -> vega.events.v1.TeamUpdated - 76, // 158: vega.events.v1.BusEvent.referee_switched_team:type_name -> vega.events.v1.RefereeSwitchedTeam - 77, // 159: vega.events.v1.BusEvent.referee_joined_team:type_name -> vega.events.v1.RefereeJoinedTeam - 82, // 160: vega.events.v1.BusEvent.referral_program_started:type_name -> vega.events.v1.ReferralProgramStarted - 83, // 161: vega.events.v1.BusEvent.referral_program_updated:type_name -> vega.events.v1.ReferralProgramUpdated - 84, // 162: vega.events.v1.BusEvent.referral_program_ended:type_name -> vega.events.v1.ReferralProgramEnded - 78, // 163: vega.events.v1.BusEvent.referral_set_created:type_name -> vega.events.v1.ReferralSetCreated - 81, // 164: vega.events.v1.BusEvent.referee_joined_referral_set:type_name -> vega.events.v1.RefereeJoinedReferralSet - 20, // 165: vega.events.v1.BusEvent.party_activity_streak:type_name -> vega.events.v1.PartyActivityStreak - 85, // 166: vega.events.v1.BusEvent.volume_discount_program_started:type_name -> vega.events.v1.VolumeDiscountProgramStarted - 86, // 167: vega.events.v1.BusEvent.volume_discount_program_updated:type_name -> vega.events.v1.VolumeDiscountProgramUpdated - 87, // 168: vega.events.v1.BusEvent.volume_discount_program_ended:type_name -> vega.events.v1.VolumeDiscountProgramEnded - 79, // 169: vega.events.v1.BusEvent.referral_set_stats_updated:type_name -> vega.events.v1.ReferralSetStatsUpdated - 14, // 170: vega.events.v1.BusEvent.vesting_stats_updated:type_name -> vega.events.v1.VestingStatsUpdated - 12, // 171: vega.events.v1.BusEvent.volume_discount_stats_updated:type_name -> vega.events.v1.VolumeDiscountStatsUpdated - 16, // 172: vega.events.v1.BusEvent.fees_stats:type_name -> vega.events.v1.FeesStats - 23, // 173: vega.events.v1.BusEvent.funding_payments:type_name -> vega.events.v1.FundingPayments - 88, // 174: vega.events.v1.BusEvent.paid_liquidity_fees_stats:type_name -> vega.events.v1.PaidLiquidityFeesStats - 8, // 175: vega.events.v1.BusEvent.vesting_balances_summary:type_name -> vega.events.v1.VestingBalancesSummary - 43, // 176: vega.events.v1.BusEvent.transfer_fees:type_name -> vega.events.v1.TransferFees - 44, // 177: vega.events.v1.BusEvent.transfer_fees_discount:type_name -> vega.events.v1.TransferFeesDiscount - 89, // 178: vega.events.v1.BusEvent.party_margin_mode_updated:type_name -> vega.events.v1.PartyMarginModeUpdated - 90, // 179: vega.events.v1.BusEvent.party_profile_updated:type_name -> vega.events.v1.PartyProfileUpdated - 91, // 180: vega.events.v1.BusEvent.teams_stats_updated:type_name -> vega.events.v1.TeamsStatsUpdated - 7, // 181: vega.events.v1.BusEvent.time_weighted_notional_position_updated:type_name -> vega.events.v1.TimeWeightedNotionalPositionUpdated - 73, // 182: vega.events.v1.BusEvent.cancelled_orders:type_name -> vega.events.v1.CancelledOrders - 42, // 183: vega.events.v1.BusEvent.market:type_name -> vega.events.v1.MarketEvent - 46, // 184: vega.events.v1.BusEvent.tx_err_event:type_name -> vega.events.v1.TxErrorEvent - 185, // [185:185] is the sub-list for method output_type - 185, // [185:185] is the sub-list for method input_type - 185, // [185:185] is the sub-list for extension type_name - 185, // [185:185] is the sub-list for extension extendee - 0, // [0:185] is the sub-list for field type_name + 98, // 0: vega.events.v1.AMMPool.parameters:type_name -> vega.events.v1.AMMPool.ConcentratedLiquidityParameters + 2, // 1: vega.events.v1.AMMPool.status:type_name -> vega.events.v1.AMMPool.Status + 3, // 2: vega.events.v1.AMMPool.status_reason:type_name -> vega.events.v1.AMMPool.StatusReason + 12, // 3: vega.events.v1.VestingBalancesSummary.parties_vesting_summary:type_name -> vega.events.v1.PartyVestingSummary + 13, // 4: vega.events.v1.PartyVestingSummary.party_locked_balances:type_name -> vega.events.v1.PartyLockedBalance + 14, // 5: vega.events.v1.PartyVestingSummary.party_vesting_balances:type_name -> vega.events.v1.PartyVestingBalance + 16, // 6: vega.events.v1.VolumeDiscountStatsUpdated.stats:type_name -> vega.events.v1.PartyVolumeDiscountStats + 18, // 7: vega.events.v1.VestingStatsUpdated.stats:type_name -> vega.events.v1.PartyVestingStats + 22, // 8: vega.events.v1.FeesStats.total_rewards_received:type_name -> vega.events.v1.PartyAmount + 20, // 9: vega.events.v1.FeesStats.referrer_rewards_generated:type_name -> vega.events.v1.ReferrerRewardsGenerated + 22, // 10: vega.events.v1.FeesStats.referees_discount_applied:type_name -> vega.events.v1.PartyAmount + 22, // 11: vega.events.v1.FeesStats.volume_discount_applied:type_name -> vega.events.v1.PartyAmount + 22, // 12: vega.events.v1.FeesStats.total_maker_fees_received:type_name -> vega.events.v1.PartyAmount + 21, // 13: vega.events.v1.FeesStats.maker_fees_generated:type_name -> vega.events.v1.MakerFeesGenerated + 22, // 14: vega.events.v1.FeesStats.total_fees_paid_and_received:type_name -> vega.events.v1.PartyAmount + 22, // 15: vega.events.v1.ReferrerRewardsGenerated.generated_reward:type_name -> vega.events.v1.PartyAmount + 22, // 16: vega.events.v1.MakerFeesGenerated.maker_fees_paid:type_name -> vega.events.v1.PartyAmount + 25, // 17: vega.events.v1.FundingPayments.payments:type_name -> vega.events.v1.FundingPayment + 4, // 18: vega.events.v1.FundingPeriodDataPoint.data_point_type:type_name -> vega.events.v1.FundingPeriodDataPoint.Source + 101, // 19: vega.events.v1.StopOrderEvent.submission:type_name -> vega.commands.v1.OrderSubmission + 102, // 20: vega.events.v1.StopOrderEvent.stop_order:type_name -> vega.StopOrder + 30, // 21: vega.events.v1.ERC20MultiSigSignerRemoved.signature_submitters:type_name -> vega.events.v1.ERC20MultiSigSignerRemovedSubmitter + 103, // 22: vega.events.v1.Transfer.from_account_type:type_name -> vega.AccountType + 103, // 23: vega.events.v1.Transfer.to_account_type:type_name -> vega.AccountType + 5, // 24: vega.events.v1.Transfer.status:type_name -> vega.events.v1.Transfer.Status + 34, // 25: vega.events.v1.Transfer.one_off:type_name -> vega.events.v1.OneOffTransfer + 35, // 26: vega.events.v1.Transfer.recurring:type_name -> vega.events.v1.RecurringTransfer + 33, // 27: vega.events.v1.Transfer.one_off_governance:type_name -> vega.events.v1.OneOffGovernanceTransfer + 36, // 28: vega.events.v1.Transfer.recurring_governance:type_name -> vega.events.v1.RecurringGovernanceTransfer + 104, // 29: vega.events.v1.RecurringTransfer.dispatch_strategy:type_name -> vega.DispatchStrategy + 104, // 30: vega.events.v1.RecurringGovernanceTransfer.dispatch_strategy:type_name -> vega.DispatchStrategy + 6, // 31: vega.events.v1.StakeLinking.type:type_name -> vega.events.v1.StakeLinking.Type + 7, // 32: vega.events.v1.StakeLinking.status:type_name -> vega.events.v1.StakeLinking.Status + 8, // 33: vega.events.v1.ERC20MultiSigSignerEvent.type:type_name -> vega.events.v1.ERC20MultiSigSignerEvent.Type + 101, // 34: vega.events.v1.TransactionResult.order_submission:type_name -> vega.commands.v1.OrderSubmission + 105, // 35: vega.events.v1.TransactionResult.order_amendment:type_name -> vega.commands.v1.OrderAmendment + 106, // 36: vega.events.v1.TransactionResult.order_cancellation:type_name -> vega.commands.v1.OrderCancellation + 107, // 37: vega.events.v1.TransactionResult.proposal:type_name -> vega.commands.v1.ProposalSubmission + 108, // 38: vega.events.v1.TransactionResult.vote_submission:type_name -> vega.commands.v1.VoteSubmission + 109, // 39: vega.events.v1.TransactionResult.liquidity_provision_submission:type_name -> vega.commands.v1.LiquidityProvisionSubmission + 110, // 40: vega.events.v1.TransactionResult.withdraw_submission:type_name -> vega.commands.v1.WithdrawSubmission + 111, // 41: vega.events.v1.TransactionResult.delegate_submission:type_name -> vega.commands.v1.DelegateSubmission + 112, // 42: vega.events.v1.TransactionResult.undelegate_submission:type_name -> vega.commands.v1.UndelegateSubmission + 113, // 43: vega.events.v1.TransactionResult.liquidity_provision_cancellation:type_name -> vega.commands.v1.LiquidityProvisionCancellation + 114, // 44: vega.events.v1.TransactionResult.liquidity_provision_amendment:type_name -> vega.commands.v1.LiquidityProvisionAmendment + 115, // 45: vega.events.v1.TransactionResult.transfer:type_name -> vega.commands.v1.Transfer + 116, // 46: vega.events.v1.TransactionResult.cancel_transfer:type_name -> vega.commands.v1.CancelTransfer + 117, // 47: vega.events.v1.TransactionResult.announce_node:type_name -> vega.commands.v1.AnnounceNode + 118, // 48: vega.events.v1.TransactionResult.oracle_data_submission:type_name -> vega.commands.v1.OracleDataSubmission + 119, // 49: vega.events.v1.TransactionResult.protocol_upgrade_proposal:type_name -> vega.commands.v1.ProtocolUpgradeProposal + 120, // 50: vega.events.v1.TransactionResult.issue_signatures:type_name -> vega.commands.v1.IssueSignatures + 121, // 51: vega.events.v1.TransactionResult.batch_market_instructions:type_name -> vega.commands.v1.BatchMarketInstructions + 122, // 52: vega.events.v1.TransactionResult.key_rotate_submission:type_name -> vega.commands.v1.KeyRotateSubmission + 123, // 53: vega.events.v1.TransactionResult.ethereum_key_rotate_submission:type_name -> vega.commands.v1.EthereumKeyRotateSubmission + 124, // 54: vega.events.v1.TransactionResult.stop_orders_submission:type_name -> vega.commands.v1.StopOrdersSubmission + 125, // 55: vega.events.v1.TransactionResult.stop_orders_cancellation:type_name -> vega.commands.v1.StopOrdersCancellation + 126, // 56: vega.events.v1.TransactionResult.create_referral_set:type_name -> vega.commands.v1.CreateReferralSet + 127, // 57: vega.events.v1.TransactionResult.update_referral_set:type_name -> vega.commands.v1.UpdateReferralSet + 128, // 58: vega.events.v1.TransactionResult.apply_referral_code:type_name -> vega.commands.v1.ApplyReferralCode + 129, // 59: vega.events.v1.TransactionResult.update_margin_mode:type_name -> vega.commands.v1.UpdateMarginMode + 130, // 60: vega.events.v1.TransactionResult.join_team:type_name -> vega.commands.v1.JoinTeam + 131, // 61: vega.events.v1.TransactionResult.batch_proposal:type_name -> vega.commands.v1.BatchProposalSubmission + 132, // 62: vega.events.v1.TransactionResult.update_party_profile:type_name -> vega.commands.v1.UpdatePartyProfile + 133, // 63: vega.events.v1.TransactionResult.submit_amm:type_name -> vega.commands.v1.SubmitAMM + 134, // 64: vega.events.v1.TransactionResult.amend_amm:type_name -> vega.commands.v1.AmendAMM + 135, // 65: vega.events.v1.TransactionResult.cancel_amm:type_name -> vega.commands.v1.CancelAMM + 99, // 66: vega.events.v1.TransactionResult.success:type_name -> vega.events.v1.TransactionResult.SuccessDetails + 100, // 67: vega.events.v1.TransactionResult.failure:type_name -> vega.events.v1.TransactionResult.FailureDetails + 101, // 68: vega.events.v1.TxErrorEvent.order_submission:type_name -> vega.commands.v1.OrderSubmission + 105, // 69: vega.events.v1.TxErrorEvent.order_amendment:type_name -> vega.commands.v1.OrderAmendment + 106, // 70: vega.events.v1.TxErrorEvent.order_cancellation:type_name -> vega.commands.v1.OrderCancellation + 107, // 71: vega.events.v1.TxErrorEvent.proposal:type_name -> vega.commands.v1.ProposalSubmission + 108, // 72: vega.events.v1.TxErrorEvent.vote_submission:type_name -> vega.commands.v1.VoteSubmission + 109, // 73: vega.events.v1.TxErrorEvent.liquidity_provision_submission:type_name -> vega.commands.v1.LiquidityProvisionSubmission + 110, // 74: vega.events.v1.TxErrorEvent.withdraw_submission:type_name -> vega.commands.v1.WithdrawSubmission + 111, // 75: vega.events.v1.TxErrorEvent.delegate_submission:type_name -> vega.commands.v1.DelegateSubmission + 112, // 76: vega.events.v1.TxErrorEvent.undelegate_submission:type_name -> vega.commands.v1.UndelegateSubmission + 113, // 77: vega.events.v1.TxErrorEvent.liquidity_provision_cancellation:type_name -> vega.commands.v1.LiquidityProvisionCancellation + 114, // 78: vega.events.v1.TxErrorEvent.liquidity_provision_amendment:type_name -> vega.commands.v1.LiquidityProvisionAmendment + 115, // 79: vega.events.v1.TxErrorEvent.transfer:type_name -> vega.commands.v1.Transfer + 116, // 80: vega.events.v1.TxErrorEvent.cancel_transfer:type_name -> vega.commands.v1.CancelTransfer + 117, // 81: vega.events.v1.TxErrorEvent.announce_node:type_name -> vega.commands.v1.AnnounceNode + 118, // 82: vega.events.v1.TxErrorEvent.oracle_data_submission:type_name -> vega.commands.v1.OracleDataSubmission + 119, // 83: vega.events.v1.TxErrorEvent.protocol_upgrade_proposal:type_name -> vega.commands.v1.ProtocolUpgradeProposal + 120, // 84: vega.events.v1.TxErrorEvent.issue_signatures:type_name -> vega.commands.v1.IssueSignatures + 121, // 85: vega.events.v1.TxErrorEvent.batch_market_instructions:type_name -> vega.commands.v1.BatchMarketInstructions + 136, // 86: vega.events.v1.EpochEvent.action:type_name -> vega.EpochAction + 137, // 87: vega.events.v1.LedgerMovements.ledger_movements:type_name -> vega.LedgerMovement + 55, // 88: vega.events.v1.SettlePosition.trade_settlements:type_name -> vega.events.v1.TradeSettlement + 138, // 89: vega.events.v1.AuctionEvent.trigger:type_name -> vega.AuctionTrigger + 138, // 90: vega.events.v1.AuctionEvent.extension_trigger:type_name -> vega.AuctionTrigger + 0, // 91: vega.events.v1.ProtocolUpgradeEvent.status:type_name -> vega.events.v1.ProtocolUpgradeProposalStatus + 83, // 92: vega.events.v1.ReferralSetStatsUpdated.referees_stats:type_name -> vega.events.v1.RefereeStats + 139, // 93: vega.events.v1.ReferralProgramStarted.program:type_name -> vega.ReferralProgram + 139, // 94: vega.events.v1.ReferralProgramUpdated.program:type_name -> vega.ReferralProgram + 140, // 95: vega.events.v1.VolumeDiscountProgramStarted.program:type_name -> vega.VolumeDiscountProgram + 140, // 96: vega.events.v1.VolumeDiscountProgramUpdated.program:type_name -> vega.VolumeDiscountProgram + 22, // 97: vega.events.v1.PaidLiquidityFeesStats.fees_paid_per_party:type_name -> vega.events.v1.PartyAmount + 141, // 98: vega.events.v1.PartyMarginModeUpdated.margin_mode:type_name -> vega.MarginMode + 142, // 99: vega.events.v1.PartyProfileUpdated.updated_profile:type_name -> vega.PartyProfile + 95, // 100: vega.events.v1.TeamsStatsUpdated.stats:type_name -> vega.events.v1.TeamStats + 96, // 101: vega.events.v1.TeamStats.members_stats:type_name -> vega.events.v1.TeamMemberStats + 1, // 102: vega.events.v1.BusEvent.type:type_name -> vega.events.v1.BusEventType + 50, // 103: vega.events.v1.BusEvent.time_update:type_name -> vega.events.v1.TimeUpdate + 52, // 104: vega.events.v1.BusEvent.ledger_movements:type_name -> vega.events.v1.LedgerMovements + 53, // 105: vega.events.v1.BusEvent.position_resolution:type_name -> vega.events.v1.PositionResolution + 143, // 106: vega.events.v1.BusEvent.order:type_name -> vega.Order + 144, // 107: vega.events.v1.BusEvent.account:type_name -> vega.Account + 145, // 108: vega.events.v1.BusEvent.party:type_name -> vega.Party + 146, // 109: vega.events.v1.BusEvent.trade:type_name -> vega.Trade + 147, // 110: vega.events.v1.BusEvent.margin_levels:type_name -> vega.MarginLevels + 148, // 111: vega.events.v1.BusEvent.proposal:type_name -> vega.Proposal + 149, // 112: vega.events.v1.BusEvent.vote:type_name -> vega.Vote + 150, // 113: vega.events.v1.BusEvent.market_data:type_name -> vega.MarketData + 151, // 114: vega.events.v1.BusEvent.node_signature:type_name -> vega.commands.v1.NodeSignature + 54, // 115: vega.events.v1.BusEvent.loss_socialization:type_name -> vega.events.v1.LossSocialization + 56, // 116: vega.events.v1.BusEvent.settle_position:type_name -> vega.events.v1.SettlePosition + 59, // 117: vega.events.v1.BusEvent.settle_distressed:type_name -> vega.events.v1.SettleDistressed + 152, // 118: vega.events.v1.BusEvent.market_created:type_name -> vega.Market + 153, // 119: vega.events.v1.BusEvent.asset:type_name -> vega.Asset + 62, // 120: vega.events.v1.BusEvent.market_tick:type_name -> vega.events.v1.MarketTick + 154, // 121: vega.events.v1.BusEvent.withdrawal:type_name -> vega.Withdrawal + 155, // 122: vega.events.v1.BusEvent.deposit:type_name -> vega.Deposit + 63, // 123: vega.events.v1.BusEvent.auction:type_name -> vega.events.v1.AuctionEvent + 156, // 124: vega.events.v1.BusEvent.risk_factor:type_name -> vega.RiskFactor + 157, // 125: vega.events.v1.BusEvent.network_parameter:type_name -> vega.NetworkParameter + 158, // 126: vega.events.v1.BusEvent.liquidity_provision:type_name -> vega.LiquidityProvision + 152, // 127: vega.events.v1.BusEvent.market_updated:type_name -> vega.Market + 159, // 128: vega.events.v1.BusEvent.oracle_spec:type_name -> vega.OracleSpec + 160, // 129: vega.events.v1.BusEvent.oracle_data:type_name -> vega.OracleData + 44, // 130: vega.events.v1.BusEvent.delegation_balance:type_name -> vega.events.v1.DelegationBalanceEvent + 43, // 131: vega.events.v1.BusEvent.validator_score:type_name -> vega.events.v1.ValidatorScoreEvent + 51, // 132: vega.events.v1.BusEvent.epoch_event:type_name -> vega.events.v1.EpochEvent + 64, // 133: vega.events.v1.BusEvent.validator_update:type_name -> vega.events.v1.ValidatorUpdate + 37, // 134: vega.events.v1.BusEvent.stake_linking:type_name -> vega.events.v1.StakeLinking + 42, // 135: vega.events.v1.BusEvent.reward_payout:type_name -> vega.events.v1.RewardPayoutEvent + 40, // 136: vega.events.v1.BusEvent.checkpoint:type_name -> vega.events.v1.CheckpointEvent + 66, // 137: vega.events.v1.BusEvent.key_rotation:type_name -> vega.events.v1.KeyRotation + 69, // 138: vega.events.v1.BusEvent.state_var:type_name -> vega.events.v1.StateVar + 161, // 139: vega.events.v1.BusEvent.network_limits:type_name -> vega.NetworkLimits + 32, // 140: vega.events.v1.BusEvent.transfer:type_name -> vega.events.v1.Transfer + 65, // 141: vega.events.v1.BusEvent.ranking_event:type_name -> vega.events.v1.ValidatorRankingEvent + 38, // 142: vega.events.v1.BusEvent.erc20_multisig_signer_event:type_name -> vega.events.v1.ERC20MultiSigSignerEvent + 39, // 143: vega.events.v1.BusEvent.erc20_multisig_set_threshold_event:type_name -> vega.events.v1.ERC20MultiSigThresholdSetEvent + 29, // 144: vega.events.v1.BusEvent.erc20_multisig_signer_added:type_name -> vega.events.v1.ERC20MultiSigSignerAdded + 31, // 145: vega.events.v1.BusEvent.erc20_multisig_signer_removed:type_name -> vega.events.v1.ERC20MultiSigSignerRemoved + 58, // 146: vega.events.v1.BusEvent.position_state_event:type_name -> vega.events.v1.PositionStateEvent + 67, // 147: vega.events.v1.BusEvent.ethereum_key_rotation:type_name -> vega.events.v1.EthereumKeyRotation + 68, // 148: vega.events.v1.BusEvent.protocol_upgrade_event:type_name -> vega.events.v1.ProtocolUpgradeEvent + 70, // 149: vega.events.v1.BusEvent.begin_block:type_name -> vega.events.v1.BeginBlock + 71, // 150: vega.events.v1.BusEvent.end_block:type_name -> vega.events.v1.EndBlock + 72, // 151: vega.events.v1.BusEvent.protocol_upgrade_started:type_name -> vega.events.v1.ProtocolUpgradeStarted + 57, // 152: vega.events.v1.BusEvent.settle_market:type_name -> vega.events.v1.SettleMarket + 48, // 153: vega.events.v1.BusEvent.transaction_result:type_name -> vega.events.v1.TransactionResult + 74, // 154: vega.events.v1.BusEvent.core_snapshot_event:type_name -> vega.events.v1.CoreSnapshotData + 73, // 155: vega.events.v1.BusEvent.protocol_upgrade_data_node_ready:type_name -> vega.events.v1.ProtocolUpgradeDataNodeReady + 60, // 156: vega.events.v1.BusEvent.distressed_orders:type_name -> vega.events.v1.DistressedOrders + 75, // 157: vega.events.v1.BusEvent.expired_orders:type_name -> vega.events.v1.ExpiredOrders + 61, // 158: vega.events.v1.BusEvent.distressed_positions:type_name -> vega.events.v1.DistressedPositions + 28, // 159: vega.events.v1.BusEvent.stop_order:type_name -> vega.events.v1.StopOrderEvent + 24, // 160: vega.events.v1.BusEvent.funding_period:type_name -> vega.events.v1.FundingPeriod + 27, // 161: vega.events.v1.BusEvent.funding_period_data_point:type_name -> vega.events.v1.FundingPeriodDataPoint + 77, // 162: vega.events.v1.BusEvent.team_created:type_name -> vega.events.v1.TeamCreated + 78, // 163: vega.events.v1.BusEvent.team_updated:type_name -> vega.events.v1.TeamUpdated + 79, // 164: vega.events.v1.BusEvent.referee_switched_team:type_name -> vega.events.v1.RefereeSwitchedTeam + 80, // 165: vega.events.v1.BusEvent.referee_joined_team:type_name -> vega.events.v1.RefereeJoinedTeam + 85, // 166: vega.events.v1.BusEvent.referral_program_started:type_name -> vega.events.v1.ReferralProgramStarted + 86, // 167: vega.events.v1.BusEvent.referral_program_updated:type_name -> vega.events.v1.ReferralProgramUpdated + 87, // 168: vega.events.v1.BusEvent.referral_program_ended:type_name -> vega.events.v1.ReferralProgramEnded + 81, // 169: vega.events.v1.BusEvent.referral_set_created:type_name -> vega.events.v1.ReferralSetCreated + 84, // 170: vega.events.v1.BusEvent.referee_joined_referral_set:type_name -> vega.events.v1.RefereeJoinedReferralSet + 23, // 171: vega.events.v1.BusEvent.party_activity_streak:type_name -> vega.events.v1.PartyActivityStreak + 88, // 172: vega.events.v1.BusEvent.volume_discount_program_started:type_name -> vega.events.v1.VolumeDiscountProgramStarted + 89, // 173: vega.events.v1.BusEvent.volume_discount_program_updated:type_name -> vega.events.v1.VolumeDiscountProgramUpdated + 90, // 174: vega.events.v1.BusEvent.volume_discount_program_ended:type_name -> vega.events.v1.VolumeDiscountProgramEnded + 82, // 175: vega.events.v1.BusEvent.referral_set_stats_updated:type_name -> vega.events.v1.ReferralSetStatsUpdated + 17, // 176: vega.events.v1.BusEvent.vesting_stats_updated:type_name -> vega.events.v1.VestingStatsUpdated + 15, // 177: vega.events.v1.BusEvent.volume_discount_stats_updated:type_name -> vega.events.v1.VolumeDiscountStatsUpdated + 19, // 178: vega.events.v1.BusEvent.fees_stats:type_name -> vega.events.v1.FeesStats + 26, // 179: vega.events.v1.BusEvent.funding_payments:type_name -> vega.events.v1.FundingPayments + 91, // 180: vega.events.v1.BusEvent.paid_liquidity_fees_stats:type_name -> vega.events.v1.PaidLiquidityFeesStats + 11, // 181: vega.events.v1.BusEvent.vesting_balances_summary:type_name -> vega.events.v1.VestingBalancesSummary + 46, // 182: vega.events.v1.BusEvent.transfer_fees:type_name -> vega.events.v1.TransferFees + 47, // 183: vega.events.v1.BusEvent.transfer_fees_discount:type_name -> vega.events.v1.TransferFeesDiscount + 92, // 184: vega.events.v1.BusEvent.party_margin_mode_updated:type_name -> vega.events.v1.PartyMarginModeUpdated + 93, // 185: vega.events.v1.BusEvent.party_profile_updated:type_name -> vega.events.v1.PartyProfileUpdated + 94, // 186: vega.events.v1.BusEvent.teams_stats_updated:type_name -> vega.events.v1.TeamsStatsUpdated + 9, // 187: vega.events.v1.BusEvent.time_weighted_notional_position_updated:type_name -> vega.events.v1.TimeWeightedNotionalPositionUpdated + 76, // 188: vega.events.v1.BusEvent.cancelled_orders:type_name -> vega.events.v1.CancelledOrders + 10, // 189: vega.events.v1.BusEvent.amm_pool:type_name -> vega.events.v1.AMMPool + 45, // 190: vega.events.v1.BusEvent.market:type_name -> vega.events.v1.MarketEvent + 49, // 191: vega.events.v1.BusEvent.tx_err_event:type_name -> vega.events.v1.TxErrorEvent + 192, // [192:192] is the sub-list for method output_type + 192, // [192:192] is the sub-list for method input_type + 192, // [192:192] is the sub-list for extension type_name + 192, // [192:192] is the sub-list for extension extendee + 0, // [0:192] is the sub-list for field type_name } func init() { file_vega_events_v1_events_proto_init() } @@ -12087,7 +12576,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VestingBalancesSummary); i { + switch v := v.(*AMMPool); i { case 0: return &v.state case 1: @@ -12099,7 +12588,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyVestingSummary); i { + switch v := v.(*VestingBalancesSummary); i { case 0: return &v.state case 1: @@ -12111,7 +12600,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyLockedBalance); i { + switch v := v.(*PartyVestingSummary); i { case 0: return &v.state case 1: @@ -12123,7 +12612,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyVestingBalance); i { + switch v := v.(*PartyLockedBalance); i { case 0: return &v.state case 1: @@ -12135,7 +12624,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeDiscountStatsUpdated); i { + switch v := v.(*PartyVestingBalance); i { case 0: return &v.state case 1: @@ -12147,7 +12636,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyVolumeDiscountStats); i { + switch v := v.(*VolumeDiscountStatsUpdated); i { case 0: return &v.state case 1: @@ -12159,7 +12648,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VestingStatsUpdated); i { + switch v := v.(*PartyVolumeDiscountStats); i { case 0: return &v.state case 1: @@ -12171,7 +12660,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyVestingStats); i { + switch v := v.(*VestingStatsUpdated); i { case 0: return &v.state case 1: @@ -12183,7 +12672,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FeesStats); i { + switch v := v.(*PartyVestingStats); i { case 0: return &v.state case 1: @@ -12195,7 +12684,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReferrerRewardsGenerated); i { + switch v := v.(*FeesStats); i { case 0: return &v.state case 1: @@ -12207,7 +12696,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MakerFeesGenerated); i { + switch v := v.(*ReferrerRewardsGenerated); i { case 0: return &v.state case 1: @@ -12219,7 +12708,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyAmount); i { + switch v := v.(*MakerFeesGenerated); i { case 0: return &v.state case 1: @@ -12231,7 +12720,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyActivityStreak); i { + switch v := v.(*PartyAmount); i { case 0: return &v.state case 1: @@ -12243,7 +12732,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FundingPeriod); i { + switch v := v.(*PartyActivityStreak); i { case 0: return &v.state case 1: @@ -12255,7 +12744,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FundingPayment); i { + switch v := v.(*FundingPeriod); i { case 0: return &v.state case 1: @@ -12267,7 +12756,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FundingPayments); i { + switch v := v.(*FundingPayment); i { case 0: return &v.state case 1: @@ -12279,7 +12768,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FundingPeriodDataPoint); i { + switch v := v.(*FundingPayments); i { case 0: return &v.state case 1: @@ -12291,7 +12780,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopOrderEvent); i { + switch v := v.(*FundingPeriodDataPoint); i { case 0: return &v.state case 1: @@ -12303,7 +12792,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20MultiSigSignerAdded); i { + switch v := v.(*StopOrderEvent); i { case 0: return &v.state case 1: @@ -12315,7 +12804,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20MultiSigSignerRemovedSubmitter); i { + switch v := v.(*ERC20MultiSigSignerAdded); i { case 0: return &v.state case 1: @@ -12327,7 +12816,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20MultiSigSignerRemoved); i { + switch v := v.(*ERC20MultiSigSignerRemovedSubmitter); i { case 0: return &v.state case 1: @@ -12339,7 +12828,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Transfer); i { + switch v := v.(*ERC20MultiSigSignerRemoved); i { case 0: return &v.state case 1: @@ -12351,7 +12840,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OneOffGovernanceTransfer); i { + switch v := v.(*Transfer); i { case 0: return &v.state case 1: @@ -12363,7 +12852,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OneOffTransfer); i { + switch v := v.(*OneOffGovernanceTransfer); i { case 0: return &v.state case 1: @@ -12375,7 +12864,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RecurringTransfer); i { + switch v := v.(*OneOffTransfer); i { case 0: return &v.state case 1: @@ -12387,7 +12876,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RecurringGovernanceTransfer); i { + switch v := v.(*RecurringTransfer); i { case 0: return &v.state case 1: @@ -12399,7 +12888,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StakeLinking); i { + switch v := v.(*RecurringGovernanceTransfer); i { case 0: return &v.state case 1: @@ -12411,7 +12900,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20MultiSigSignerEvent); i { + switch v := v.(*StakeLinking); i { case 0: return &v.state case 1: @@ -12423,7 +12912,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20MultiSigThresholdSetEvent); i { + switch v := v.(*ERC20MultiSigSignerEvent); i { case 0: return &v.state case 1: @@ -12435,7 +12924,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CheckpointEvent); i { + switch v := v.(*ERC20MultiSigThresholdSetEvent); i { case 0: return &v.state case 1: @@ -12447,7 +12936,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamStartEvent); i { + switch v := v.(*CheckpointEvent); i { case 0: return &v.state case 1: @@ -12459,7 +12948,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RewardPayoutEvent); i { + switch v := v.(*StreamStartEvent); i { case 0: return &v.state case 1: @@ -12471,7 +12960,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatorScoreEvent); i { + switch v := v.(*RewardPayoutEvent); i { case 0: return &v.state case 1: @@ -12483,7 +12972,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DelegationBalanceEvent); i { + switch v := v.(*ValidatorScoreEvent); i { case 0: return &v.state case 1: @@ -12495,7 +12984,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketEvent); i { + switch v := v.(*DelegationBalanceEvent); i { case 0: return &v.state case 1: @@ -12507,7 +12996,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransferFees); i { + switch v := v.(*MarketEvent); i { case 0: return &v.state case 1: @@ -12519,7 +13008,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransferFeesDiscount); i { + switch v := v.(*TransferFees); i { case 0: return &v.state case 1: @@ -12531,7 +13020,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionResult); i { + switch v := v.(*TransferFeesDiscount); i { case 0: return &v.state case 1: @@ -12543,7 +13032,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TxErrorEvent); i { + switch v := v.(*TransactionResult); i { case 0: return &v.state case 1: @@ -12555,7 +13044,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TimeUpdate); i { + switch v := v.(*TxErrorEvent); i { case 0: return &v.state case 1: @@ -12567,7 +13056,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EpochEvent); i { + switch v := v.(*TimeUpdate); i { case 0: return &v.state case 1: @@ -12579,7 +13068,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LedgerMovements); i { + switch v := v.(*EpochEvent); i { case 0: return &v.state case 1: @@ -12591,7 +13080,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PositionResolution); i { + switch v := v.(*LedgerMovements); i { case 0: return &v.state case 1: @@ -12603,7 +13092,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LossSocialization); i { + switch v := v.(*PositionResolution); i { case 0: return &v.state case 1: @@ -12615,7 +13104,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TradeSettlement); i { + switch v := v.(*LossSocialization); i { case 0: return &v.state case 1: @@ -12627,7 +13116,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SettlePosition); i { + switch v := v.(*TradeSettlement); i { case 0: return &v.state case 1: @@ -12639,7 +13128,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SettleMarket); i { + switch v := v.(*SettlePosition); i { case 0: return &v.state case 1: @@ -12651,7 +13140,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PositionStateEvent); i { + switch v := v.(*SettleMarket); i { case 0: return &v.state case 1: @@ -12663,7 +13152,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SettleDistressed); i { + switch v := v.(*PositionStateEvent); i { case 0: return &v.state case 1: @@ -12675,7 +13164,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DistressedOrders); i { + switch v := v.(*SettleDistressed); i { case 0: return &v.state case 1: @@ -12687,7 +13176,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DistressedPositions); i { + switch v := v.(*DistressedOrders); i { case 0: return &v.state case 1: @@ -12699,7 +13188,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketTick); i { + switch v := v.(*DistressedPositions); i { case 0: return &v.state case 1: @@ -12711,7 +13200,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuctionEvent); i { + switch v := v.(*MarketTick); i { case 0: return &v.state case 1: @@ -12723,7 +13212,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatorUpdate); i { + switch v := v.(*AuctionEvent); i { case 0: return &v.state case 1: @@ -12735,7 +13224,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatorRankingEvent); i { + switch v := v.(*ValidatorUpdate); i { case 0: return &v.state case 1: @@ -12747,7 +13236,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KeyRotation); i { + switch v := v.(*ValidatorRankingEvent); i { case 0: return &v.state case 1: @@ -12759,7 +13248,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EthereumKeyRotation); i { + switch v := v.(*KeyRotation); i { case 0: return &v.state case 1: @@ -12771,7 +13260,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProtocolUpgradeEvent); i { + switch v := v.(*EthereumKeyRotation); i { case 0: return &v.state case 1: @@ -12783,7 +13272,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StateVar); i { + switch v := v.(*ProtocolUpgradeEvent); i { case 0: return &v.state case 1: @@ -12795,7 +13284,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeginBlock); i { + switch v := v.(*StateVar); i { case 0: return &v.state case 1: @@ -12807,7 +13296,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EndBlock); i { + switch v := v.(*BeginBlock); i { case 0: return &v.state case 1: @@ -12819,7 +13308,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProtocolUpgradeStarted); i { + switch v := v.(*EndBlock); i { case 0: return &v.state case 1: @@ -12831,7 +13320,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProtocolUpgradeDataNodeReady); i { + switch v := v.(*ProtocolUpgradeStarted); i { case 0: return &v.state case 1: @@ -12843,7 +13332,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CoreSnapshotData); i { + switch v := v.(*ProtocolUpgradeDataNodeReady); i { case 0: return &v.state case 1: @@ -12855,7 +13344,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExpiredOrders); i { + switch v := v.(*CoreSnapshotData); i { case 0: return &v.state case 1: @@ -12867,7 +13356,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CancelledOrders); i { + switch v := v.(*ExpiredOrders); i { case 0: return &v.state case 1: @@ -12879,7 +13368,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamCreated); i { + switch v := v.(*CancelledOrders); i { case 0: return &v.state case 1: @@ -12891,7 +13380,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamUpdated); i { + switch v := v.(*TeamCreated); i { case 0: return &v.state case 1: @@ -12903,7 +13392,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RefereeSwitchedTeam); i { + switch v := v.(*TeamUpdated); i { case 0: return &v.state case 1: @@ -12915,7 +13404,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RefereeJoinedTeam); i { + switch v := v.(*RefereeSwitchedTeam); i { case 0: return &v.state case 1: @@ -12927,7 +13416,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReferralSetCreated); i { + switch v := v.(*RefereeJoinedTeam); i { case 0: return &v.state case 1: @@ -12939,7 +13428,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReferralSetStatsUpdated); i { + switch v := v.(*ReferralSetCreated); i { case 0: return &v.state case 1: @@ -12951,7 +13440,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RefereeStats); i { + switch v := v.(*ReferralSetStatsUpdated); i { case 0: return &v.state case 1: @@ -12963,7 +13452,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RefereeJoinedReferralSet); i { + switch v := v.(*RefereeStats); i { case 0: return &v.state case 1: @@ -12975,7 +13464,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReferralProgramStarted); i { + switch v := v.(*RefereeJoinedReferralSet); i { case 0: return &v.state case 1: @@ -12987,7 +13476,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReferralProgramUpdated); i { + switch v := v.(*ReferralProgramStarted); i { case 0: return &v.state case 1: @@ -12999,7 +13488,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReferralProgramEnded); i { + switch v := v.(*ReferralProgramUpdated); i { case 0: return &v.state case 1: @@ -13011,7 +13500,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeDiscountProgramStarted); i { + switch v := v.(*ReferralProgramEnded); i { case 0: return &v.state case 1: @@ -13023,7 +13512,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeDiscountProgramUpdated); i { + switch v := v.(*VolumeDiscountProgramStarted); i { case 0: return &v.state case 1: @@ -13035,7 +13524,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeDiscountProgramEnded); i { + switch v := v.(*VolumeDiscountProgramUpdated); i { case 0: return &v.state case 1: @@ -13047,7 +13536,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PaidLiquidityFeesStats); i { + switch v := v.(*VolumeDiscountProgramEnded); i { case 0: return &v.state case 1: @@ -13059,7 +13548,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyMarginModeUpdated); i { + switch v := v.(*PaidLiquidityFeesStats); i { case 0: return &v.state case 1: @@ -13071,7 +13560,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyProfileUpdated); i { + switch v := v.(*PartyMarginModeUpdated); i { case 0: return &v.state case 1: @@ -13083,7 +13572,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamsStatsUpdated); i { + switch v := v.(*PartyProfileUpdated); i { case 0: return &v.state case 1: @@ -13095,7 +13584,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamStats); i { + switch v := v.(*TeamsStatsUpdated); i { case 0: return &v.state case 1: @@ -13107,7 +13596,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeamMemberStats); i { + switch v := v.(*TeamStats); i { case 0: return &v.state case 1: @@ -13119,7 +13608,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BusEvent); i { + switch v := v.(*TeamMemberStats); i { case 0: return &v.state case 1: @@ -13131,7 +13620,7 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransactionResult_SuccessDetails); i { + switch v := v.(*BusEvent); i { case 0: return &v.state case 1: @@ -13143,6 +13632,30 @@ func file_vega_events_v1_events_proto_init() { } } file_vega_events_v1_events_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AMMPool_ConcentratedLiquidityParameters); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_events_v1_events_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransactionResult_SuccessDetails); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_events_v1_events_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionResult_FailureDetails); i { case 0: return &v.state @@ -13155,17 +13668,17 @@ func file_vega_events_v1_events_proto_init() { } } } - file_vega_events_v1_events_proto_msgTypes[14].OneofWrappers = []interface{}{} - file_vega_events_v1_events_proto_msgTypes[22].OneofWrappers = []interface{}{ + file_vega_events_v1_events_proto_msgTypes[15].OneofWrappers = []interface{}{} + file_vega_events_v1_events_proto_msgTypes[23].OneofWrappers = []interface{}{ (*Transfer_OneOff)(nil), (*Transfer_Recurring)(nil), (*Transfer_OneOffGovernance)(nil), (*Transfer_RecurringGovernance)(nil), } - file_vega_events_v1_events_proto_msgTypes[25].OneofWrappers = []interface{}{} file_vega_events_v1_events_proto_msgTypes[26].OneofWrappers = []interface{}{} - file_vega_events_v1_events_proto_msgTypes[32].OneofWrappers = []interface{}{} - file_vega_events_v1_events_proto_msgTypes[38].OneofWrappers = []interface{}{ + file_vega_events_v1_events_proto_msgTypes[27].OneofWrappers = []interface{}{} + file_vega_events_v1_events_proto_msgTypes[33].OneofWrappers = []interface{}{} + file_vega_events_v1_events_proto_msgTypes[39].OneofWrappers = []interface{}{ (*TransactionResult_OrderSubmission)(nil), (*TransactionResult_OrderAmendment)(nil), (*TransactionResult_OrderCancellation)(nil), @@ -13195,10 +13708,13 @@ func file_vega_events_v1_events_proto_init() { (*TransactionResult_JoinTeam)(nil), (*TransactionResult_BatchProposal)(nil), (*TransactionResult_UpdatePartyProfile)(nil), + (*TransactionResult_SubmitAmm)(nil), + (*TransactionResult_AmendAmm)(nil), + (*TransactionResult_CancelAmm)(nil), (*TransactionResult_Success)(nil), (*TransactionResult_Failure)(nil), } - file_vega_events_v1_events_proto_msgTypes[39].OneofWrappers = []interface{}{ + file_vega_events_v1_events_proto_msgTypes[40].OneofWrappers = []interface{}{ (*TxErrorEvent_OrderSubmission)(nil), (*TxErrorEvent_OrderAmendment)(nil), (*TxErrorEvent_OrderCancellation)(nil), @@ -13218,10 +13734,10 @@ func file_vega_events_v1_events_proto_init() { (*TxErrorEvent_IssueSignatures)(nil), (*TxErrorEvent_BatchMarketInstructions)(nil), } - file_vega_events_v1_events_proto_msgTypes[67].OneofWrappers = []interface{}{} file_vega_events_v1_events_proto_msgTypes[68].OneofWrappers = []interface{}{} - file_vega_events_v1_events_proto_msgTypes[82].OneofWrappers = []interface{}{} - file_vega_events_v1_events_proto_msgTypes[87].OneofWrappers = []interface{}{ + file_vega_events_v1_events_proto_msgTypes[69].OneofWrappers = []interface{}{} + file_vega_events_v1_events_proto_msgTypes[83].OneofWrappers = []interface{}{} + file_vega_events_v1_events_proto_msgTypes[88].OneofWrappers = []interface{}{ (*BusEvent_TimeUpdate)(nil), (*BusEvent_LedgerMovements)(nil), (*BusEvent_PositionResolution)(nil), @@ -13308,6 +13824,7 @@ func file_vega_events_v1_events_proto_init() { (*BusEvent_TeamsStatsUpdated)(nil), (*BusEvent_TimeWeightedNotionalPositionUpdated)(nil), (*BusEvent_CancelledOrders)(nil), + (*BusEvent_AmmPool)(nil), (*BusEvent_Market)(nil), (*BusEvent_TxErrEvent)(nil), } @@ -13316,8 +13833,8 @@ func file_vega_events_v1_events_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vega_events_v1_events_proto_rawDesc, - NumEnums: 7, - NumMessages: 90, + NumEnums: 9, + NumMessages: 92, NumExtensions: 0, NumServices: 0, }, diff --git a/protos/vega/snapshot/v1/snapshot.pb.go b/protos/vega/snapshot/v1/snapshot.pb.go index 0c2bd030d79..1413ee8ea41 100644 --- a/protos/vega/snapshot/v1/snapshot.pb.go +++ b/protos/vega/snapshot/v1/snapshot.pb.go @@ -5461,6 +5461,7 @@ type Market struct { InternalCompositePriceCalculator *CompositePriceCalculator `protobuf:"bytes,30,opt,name=internal_composite_price_calculator,json=internalCompositePriceCalculator,proto3,oneof" json:"internal_composite_price_calculator,omitempty"` NextInternalCompositePriceCalc int64 `protobuf:"varint,31,opt,name=next_internal_composite_price_calc,json=nextInternalCompositePriceCalc,proto3" json:"next_internal_composite_price_calc,omitempty"` MarketLiquidity *MarketLiquidity `protobuf:"bytes,32,opt,name=market_liquidity,json=marketLiquidity,proto3" json:"market_liquidity,omitempty"` + Amm *AmmState `protobuf:"bytes,33,opt,name=amm,proto3" json:"amm,omitempty"` } func (x *Market) Reset() { @@ -5719,6 +5720,13 @@ func (x *Market) GetMarketLiquidity() *MarketLiquidity { return nil } +func (x *Market) GetAmm() *AmmState { + if x != nil { + return x.Amm + } + return nil +} + type PartyMarginFactor struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5774,6 +5782,179 @@ func (x *PartyMarginFactor) GetMarginFactor() string { return "" } +type AmmState struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Sqrter []*StringMapEntry `protobuf:"bytes,1,rep,name=sqrter,proto3" json:"sqrter,omitempty"` + SubAccounts []*StringMapEntry `protobuf:"bytes,2,rep,name=sub_accounts,json=subAccounts,proto3" json:"sub_accounts,omitempty"` + Pools []*PoolMapEntry `protobuf:"bytes,3,rep,name=pools,proto3" json:"pools,omitempty"` +} + +func (x *AmmState) Reset() { + *x = AmmState{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[69] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AmmState) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AmmState) ProtoMessage() {} + +func (x *AmmState) ProtoReflect() protoreflect.Message { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[69] + 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 AmmState.ProtoReflect.Descriptor instead. +func (*AmmState) Descriptor() ([]byte, []int) { + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{69} +} + +func (x *AmmState) GetSqrter() []*StringMapEntry { + if x != nil { + return x.Sqrter + } + return nil +} + +func (x *AmmState) GetSubAccounts() []*StringMapEntry { + if x != nil { + return x.SubAccounts + } + return nil +} + +func (x *AmmState) GetPools() []*PoolMapEntry { + if x != nil { + return x.Pools + } + return nil +} + +type PoolMapEntry struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Party string `protobuf:"bytes,1,opt,name=party,proto3" json:"party,omitempty"` + Pool *PoolMapEntry_Pool `protobuf:"bytes,2,opt,name=pool,proto3" json:"pool,omitempty"` +} + +func (x *PoolMapEntry) Reset() { + *x = PoolMapEntry{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[70] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PoolMapEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PoolMapEntry) ProtoMessage() {} + +func (x *PoolMapEntry) ProtoReflect() protoreflect.Message { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[70] + 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 PoolMapEntry.ProtoReflect.Descriptor instead. +func (*PoolMapEntry) Descriptor() ([]byte, []int) { + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{70} +} + +func (x *PoolMapEntry) GetParty() string { + if x != nil { + return x.Party + } + return "" +} + +func (x *PoolMapEntry) GetPool() *PoolMapEntry_Pool { + if x != nil { + return x.Pool + } + return nil +} + +type StringMapEntry struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *StringMapEntry) Reset() { + *x = StringMapEntry{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[71] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StringMapEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StringMapEntry) ProtoMessage() {} + +func (x *StringMapEntry) ProtoReflect() protoreflect.Message { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[71] + 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 StringMapEntry.ProtoReflect.Descriptor instead. +func (*StringMapEntry) Descriptor() ([]byte, []int) { + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{71} +} + +func (x *StringMapEntry) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *StringMapEntry) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + // eventually support multiple products type Product struct { state protoimpl.MessageState @@ -5789,7 +5970,7 @@ type Product struct { func (x *Product) Reset() { *x = Product{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[69] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5802,7 +5983,7 @@ func (x *Product) String() string { func (*Product) ProtoMessage() {} func (x *Product) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[69] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5815,7 +5996,7 @@ func (x *Product) ProtoReflect() protoreflect.Message { // Deprecated: Use Product.ProtoReflect.Descriptor instead. func (*Product) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{69} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{72} } func (m *Product) GetType() isProduct_Type { @@ -5854,7 +6035,7 @@ type DataPoint struct { func (x *DataPoint) Reset() { *x = DataPoint{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[70] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5867,7 +6048,7 @@ func (x *DataPoint) String() string { func (*DataPoint) ProtoMessage() {} func (x *DataPoint) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[70] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5880,7 +6061,7 @@ func (x *DataPoint) ProtoReflect() protoreflect.Message { // Deprecated: Use DataPoint.ProtoReflect.Descriptor instead. func (*DataPoint) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{70} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{73} } func (x *DataPoint) GetPrice() string { @@ -5910,7 +6091,7 @@ type AuctionIntervals struct { func (x *AuctionIntervals) Reset() { *x = AuctionIntervals{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[71] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5923,7 +6104,7 @@ func (x *AuctionIntervals) String() string { func (*AuctionIntervals) ProtoMessage() {} func (x *AuctionIntervals) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[71] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5936,7 +6117,7 @@ func (x *AuctionIntervals) ProtoReflect() protoreflect.Message { // Deprecated: Use AuctionIntervals.ProtoReflect.Descriptor instead. func (*AuctionIntervals) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{71} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{74} } func (x *AuctionIntervals) GetT() []int64 { @@ -5973,7 +6154,7 @@ type TWAPData struct { func (x *TWAPData) Reset() { *x = TWAPData{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[72] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5986,7 +6167,7 @@ func (x *TWAPData) String() string { func (*TWAPData) ProtoMessage() {} func (x *TWAPData) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[72] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5999,7 +6180,7 @@ func (x *TWAPData) ProtoReflect() protoreflect.Message { // Deprecated: Use TWAPData.ProtoReflect.Descriptor instead. func (*TWAPData) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{72} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{75} } func (x *TWAPData) GetStart() int64 { @@ -6041,7 +6222,7 @@ type Perps struct { func (x *Perps) Reset() { *x = Perps{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[73] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6054,7 +6235,7 @@ func (x *Perps) String() string { func (*Perps) ProtoMessage() {} func (x *Perps) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[73] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6067,7 +6248,7 @@ func (x *Perps) ProtoReflect() protoreflect.Message { // Deprecated: Use Perps.ProtoReflect.Descriptor instead. func (*Perps) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{73} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{76} } func (x *Perps) GetId() string { @@ -6138,7 +6319,7 @@ type OrdersAtPrice struct { func (x *OrdersAtPrice) Reset() { *x = OrdersAtPrice{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[74] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6151,7 +6332,7 @@ func (x *OrdersAtPrice) String() string { func (*OrdersAtPrice) ProtoMessage() {} func (x *OrdersAtPrice) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[74] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6164,7 +6345,7 @@ func (x *OrdersAtPrice) ProtoReflect() protoreflect.Message { // Deprecated: Use OrdersAtPrice.ProtoReflect.Descriptor instead. func (*OrdersAtPrice) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{74} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{77} } func (x *OrdersAtPrice) GetPrice() string { @@ -6193,7 +6374,7 @@ type PricedStopOrders struct { func (x *PricedStopOrders) Reset() { *x = PricedStopOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[75] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6206,7 +6387,7 @@ func (x *PricedStopOrders) String() string { func (*PricedStopOrders) ProtoMessage() {} func (x *PricedStopOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[75] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6219,7 +6400,7 @@ func (x *PricedStopOrders) ProtoReflect() protoreflect.Message { // Deprecated: Use PricedStopOrders.ProtoReflect.Descriptor instead. func (*PricedStopOrders) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{75} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{78} } func (x *PricedStopOrders) GetFallsBellow() []*OrdersAtPrice { @@ -6249,7 +6430,7 @@ type TrailingStopOrders struct { func (x *TrailingStopOrders) Reset() { *x = TrailingStopOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[76] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6262,7 +6443,7 @@ func (x *TrailingStopOrders) String() string { func (*TrailingStopOrders) ProtoMessage() {} func (x *TrailingStopOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[76] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6275,7 +6456,7 @@ func (x *TrailingStopOrders) ProtoReflect() protoreflect.Message { // Deprecated: Use TrailingStopOrders.ProtoReflect.Descriptor instead. func (*TrailingStopOrders) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{76} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{79} } func (x *TrailingStopOrders) GetLastSeenPrice() string { @@ -6311,7 +6492,7 @@ type OrdersAtOffset struct { func (x *OrdersAtOffset) Reset() { *x = OrdersAtOffset{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[77] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6324,7 +6505,7 @@ func (x *OrdersAtOffset) String() string { func (*OrdersAtOffset) ProtoMessage() {} func (x *OrdersAtOffset) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[77] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6337,7 +6518,7 @@ func (x *OrdersAtOffset) ProtoReflect() protoreflect.Message { // Deprecated: Use OrdersAtOffset.ProtoReflect.Descriptor instead. func (*OrdersAtOffset) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{77} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{80} } func (x *OrdersAtOffset) GetOffset() string { @@ -6366,7 +6547,7 @@ type OffsetsAtPrice struct { func (x *OffsetsAtPrice) Reset() { *x = OffsetsAtPrice{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[78] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6379,7 +6560,7 @@ func (x *OffsetsAtPrice) String() string { func (*OffsetsAtPrice) ProtoMessage() {} func (x *OffsetsAtPrice) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[78] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6392,7 +6573,7 @@ func (x *OffsetsAtPrice) ProtoReflect() protoreflect.Message { // Deprecated: Use OffsetsAtPrice.ProtoReflect.Descriptor instead. func (*OffsetsAtPrice) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{78} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{81} } func (x *OffsetsAtPrice) GetPrice() string { @@ -6422,7 +6603,7 @@ type StopOrders struct { func (x *StopOrders) Reset() { *x = StopOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[79] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6435,7 +6616,7 @@ func (x *StopOrders) String() string { func (*StopOrders) ProtoMessage() {} func (x *StopOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[79] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6448,7 +6629,7 @@ func (x *StopOrders) ProtoReflect() protoreflect.Message { // Deprecated: Use StopOrders.ProtoReflect.Descriptor instead. func (*StopOrders) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{79} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{82} } func (x *StopOrders) GetStopOrders() []*v12.StopOrderEvent { @@ -6483,7 +6664,7 @@ type PeggedOrders struct { func (x *PeggedOrders) Reset() { *x = PeggedOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[80] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6496,7 +6677,7 @@ func (x *PeggedOrders) String() string { func (*PeggedOrders) ProtoMessage() {} func (x *PeggedOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[80] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6509,7 +6690,7 @@ func (x *PeggedOrders) ProtoReflect() protoreflect.Message { // Deprecated: Use PeggedOrders.ProtoReflect.Descriptor instead. func (*PeggedOrders) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{80} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{83} } func (x *PeggedOrders) GetParkedOrders() []*vega.Order { @@ -6536,7 +6717,7 @@ type SLANetworkParams struct { func (x *SLANetworkParams) Reset() { *x = SLANetworkParams{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[81] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6549,7 +6730,7 @@ func (x *SLANetworkParams) String() string { func (*SLANetworkParams) ProtoMessage() {} func (x *SLANetworkParams) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[81] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6562,7 +6743,7 @@ func (x *SLANetworkParams) ProtoReflect() protoreflect.Message { // Deprecated: Use SLANetworkParams.ProtoReflect.Descriptor instead. func (*SLANetworkParams) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{81} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{84} } func (x *SLANetworkParams) GetBondPenaltyFactor() string { @@ -6630,7 +6811,7 @@ type ExecutionMarkets struct { func (x *ExecutionMarkets) Reset() { *x = ExecutionMarkets{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[82] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6643,7 +6824,7 @@ func (x *ExecutionMarkets) String() string { func (*ExecutionMarkets) ProtoMessage() {} func (x *ExecutionMarkets) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[82] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6656,7 +6837,7 @@ func (x *ExecutionMarkets) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecutionMarkets.ProtoReflect.Descriptor instead. func (*ExecutionMarkets) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{82} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{85} } func (x *ExecutionMarkets) GetMarkets() []*Market { @@ -6713,7 +6894,7 @@ type Successors struct { func (x *Successors) Reset() { *x = Successors{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[83] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6726,7 +6907,7 @@ func (x *Successors) String() string { func (*Successors) ProtoMessage() {} func (x *Successors) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[83] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6739,7 +6920,7 @@ func (x *Successors) ProtoReflect() protoreflect.Message { // Deprecated: Use Successors.ProtoReflect.Descriptor instead. func (*Successors) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{83} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{86} } func (x *Successors) GetParentMarket() string { @@ -6775,7 +6956,7 @@ type Position struct { func (x *Position) Reset() { *x = Position{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[84] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6788,7 +6969,7 @@ func (x *Position) String() string { func (*Position) ProtoMessage() {} func (x *Position) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[84] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6801,7 +6982,7 @@ func (x *Position) ProtoReflect() protoreflect.Message { // Deprecated: Use Position.ProtoReflect.Descriptor instead. func (*Position) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{84} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{87} } func (x *Position) GetPartyId() string { @@ -6880,7 +7061,7 @@ type MarketPositions struct { func (x *MarketPositions) Reset() { *x = MarketPositions{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[85] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6893,7 +7074,7 @@ func (x *MarketPositions) String() string { func (*MarketPositions) ProtoMessage() {} func (x *MarketPositions) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[85] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6906,7 +7087,7 @@ func (x *MarketPositions) ProtoReflect() protoreflect.Message { // Deprecated: Use MarketPositions.ProtoReflect.Descriptor instead. func (*MarketPositions) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{85} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{88} } func (x *MarketPositions) GetMarketId() string { @@ -6944,7 +7125,7 @@ type PartyPositionStats struct { func (x *PartyPositionStats) Reset() { *x = PartyPositionStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[86] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6957,7 +7138,7 @@ func (x *PartyPositionStats) String() string { func (*PartyPositionStats) ProtoMessage() {} func (x *PartyPositionStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[86] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6970,7 +7151,7 @@ func (x *PartyPositionStats) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyPositionStats.ProtoReflect.Descriptor instead. func (*PartyPositionStats) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{86} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{89} } func (x *PartyPositionStats) GetParty() string { @@ -7015,7 +7196,7 @@ type SettlementState struct { func (x *SettlementState) Reset() { *x = SettlementState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[87] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7028,7 +7209,7 @@ func (x *SettlementState) String() string { func (*SettlementState) ProtoMessage() {} func (x *SettlementState) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[87] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7041,7 +7222,7 @@ func (x *SettlementState) ProtoReflect() protoreflect.Message { // Deprecated: Use SettlementState.ProtoReflect.Descriptor instead. func (*SettlementState) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{87} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{90} } func (x *SettlementState) GetMarketId() string { @@ -7084,7 +7265,7 @@ type LastSettledPosition struct { func (x *LastSettledPosition) Reset() { *x = LastSettledPosition{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[88] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7097,7 +7278,7 @@ func (x *LastSettledPosition) String() string { func (*LastSettledPosition) ProtoMessage() {} func (x *LastSettledPosition) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[88] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7110,7 +7291,7 @@ func (x *LastSettledPosition) ProtoReflect() protoreflect.Message { // Deprecated: Use LastSettledPosition.ProtoReflect.Descriptor instead. func (*LastSettledPosition) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{88} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{91} } func (x *LastSettledPosition) GetParty() string { @@ -7142,7 +7323,7 @@ type SettlementTrade struct { func (x *SettlementTrade) Reset() { *x = SettlementTrade{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[89] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7155,7 +7336,7 @@ func (x *SettlementTrade) String() string { func (*SettlementTrade) ProtoMessage() {} func (x *SettlementTrade) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[89] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7168,7 +7349,7 @@ func (x *SettlementTrade) ProtoReflect() protoreflect.Message { // Deprecated: Use SettlementTrade.ProtoReflect.Descriptor instead. func (*SettlementTrade) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{89} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{92} } func (x *SettlementTrade) GetPartyId() string { @@ -7222,7 +7403,7 @@ type AppState struct { func (x *AppState) Reset() { *x = AppState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[90] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7235,7 +7416,7 @@ func (x *AppState) String() string { func (*AppState) ProtoMessage() {} func (x *AppState) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[90] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7248,7 +7429,7 @@ func (x *AppState) ProtoReflect() protoreflect.Message { // Deprecated: Use AppState.ProtoReflect.Descriptor instead. func (*AppState) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{90} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{93} } func (x *AppState) GetHeight() uint64 { @@ -7314,7 +7495,7 @@ type EpochState struct { func (x *EpochState) Reset() { *x = EpochState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[91] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7327,7 +7508,7 @@ func (x *EpochState) String() string { func (*EpochState) ProtoMessage() {} func (x *EpochState) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[91] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7340,7 +7521,7 @@ func (x *EpochState) ProtoReflect() protoreflect.Message { // Deprecated: Use EpochState.ProtoReflect.Descriptor instead. func (*EpochState) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{91} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{94} } func (x *EpochState) GetSeq() uint64 { @@ -7389,7 +7570,7 @@ type RewardsPendingPayouts struct { func (x *RewardsPendingPayouts) Reset() { *x = RewardsPendingPayouts{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[92] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7402,7 +7583,7 @@ func (x *RewardsPendingPayouts) String() string { func (*RewardsPendingPayouts) ProtoMessage() {} func (x *RewardsPendingPayouts) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[92] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7415,7 +7596,7 @@ func (x *RewardsPendingPayouts) ProtoReflect() protoreflect.Message { // Deprecated: Use RewardsPendingPayouts.ProtoReflect.Descriptor instead. func (*RewardsPendingPayouts) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{92} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{95} } func (x *RewardsPendingPayouts) GetScheduledRewardsPayout() []*ScheduledRewardsPayout { @@ -7437,7 +7618,7 @@ type ScheduledRewardsPayout struct { func (x *ScheduledRewardsPayout) Reset() { *x = ScheduledRewardsPayout{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[93] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7450,7 +7631,7 @@ func (x *ScheduledRewardsPayout) String() string { func (*ScheduledRewardsPayout) ProtoMessage() {} func (x *ScheduledRewardsPayout) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[93] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7463,7 +7644,7 @@ func (x *ScheduledRewardsPayout) ProtoReflect() protoreflect.Message { // Deprecated: Use ScheduledRewardsPayout.ProtoReflect.Descriptor instead. func (*ScheduledRewardsPayout) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{93} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{96} } func (x *ScheduledRewardsPayout) GetPayoutTime() int64 { @@ -7496,7 +7677,7 @@ type RewardsPayout struct { func (x *RewardsPayout) Reset() { *x = RewardsPayout{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[94] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7509,7 +7690,7 @@ func (x *RewardsPayout) String() string { func (*RewardsPayout) ProtoMessage() {} func (x *RewardsPayout) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[94] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7522,7 +7703,7 @@ func (x *RewardsPayout) ProtoReflect() protoreflect.Message { // Deprecated: Use RewardsPayout.ProtoReflect.Descriptor instead. func (*RewardsPayout) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{94} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{97} } func (x *RewardsPayout) GetFromAccount() string { @@ -7579,7 +7760,7 @@ type RewardsPartyAmount struct { func (x *RewardsPartyAmount) Reset() { *x = RewardsPartyAmount{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[95] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7592,7 +7773,7 @@ func (x *RewardsPartyAmount) String() string { func (*RewardsPartyAmount) ProtoMessage() {} func (x *RewardsPartyAmount) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[95] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7605,7 +7786,7 @@ func (x *RewardsPartyAmount) ProtoReflect() protoreflect.Message { // Deprecated: Use RewardsPartyAmount.ProtoReflect.Descriptor instead. func (*RewardsPartyAmount) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{95} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{98} } func (x *RewardsPartyAmount) GetParty() string { @@ -7643,12 +7824,13 @@ type LimitState struct { ProposeAssetEnabledFrom int64 `protobuf:"varint,8,opt,name=propose_asset_enabled_from,json=proposeAssetEnabledFrom,proto3" json:"propose_asset_enabled_from,omitempty"` ProposeSpotMarketEnabled bool `protobuf:"varint,9,opt,name=propose_spot_market_enabled,json=proposeSpotMarketEnabled,proto3" json:"propose_spot_market_enabled,omitempty"` ProposePerpsMarketEnabled bool `protobuf:"varint,10,opt,name=propose_perps_market_enabled,json=proposePerpsMarketEnabled,proto3" json:"propose_perps_market_enabled,omitempty"` + CanUseAmmEnabled bool `protobuf:"varint,11,opt,name=can_use_amm_enabled,json=canUseAmmEnabled,proto3" json:"can_use_amm_enabled,omitempty"` } func (x *LimitState) Reset() { *x = LimitState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[96] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7661,7 +7843,7 @@ func (x *LimitState) String() string { func (*LimitState) ProtoMessage() {} func (x *LimitState) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[96] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7674,7 +7856,7 @@ func (x *LimitState) ProtoReflect() protoreflect.Message { // Deprecated: Use LimitState.ProtoReflect.Descriptor instead. func (*LimitState) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{96} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{99} } func (x *LimitState) GetBlockCount() uint32 { @@ -7747,6 +7929,13 @@ func (x *LimitState) GetProposePerpsMarketEnabled() bool { return false } +func (x *LimitState) GetCanUseAmmEnabled() bool { + if x != nil { + return x.CanUseAmmEnabled + } + return false +} + type VoteSpamPolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -7765,7 +7954,7 @@ type VoteSpamPolicy struct { func (x *VoteSpamPolicy) Reset() { *x = VoteSpamPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[97] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7778,7 +7967,7 @@ func (x *VoteSpamPolicy) String() string { func (*VoteSpamPolicy) ProtoMessage() {} func (x *VoteSpamPolicy) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[97] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7791,7 +7980,7 @@ func (x *VoteSpamPolicy) ProtoReflect() protoreflect.Message { // Deprecated: Use VoteSpamPolicy.ProtoReflect.Descriptor instead. func (*VoteSpamPolicy) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{97} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{100} } func (x *VoteSpamPolicy) GetPartyToVote() []*PartyProposalVoteCount { @@ -7863,7 +8052,7 @@ type PartyProposalVoteCount struct { func (x *PartyProposalVoteCount) Reset() { *x = PartyProposalVoteCount{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[98] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7876,7 +8065,7 @@ func (x *PartyProposalVoteCount) String() string { func (*PartyProposalVoteCount) ProtoMessage() {} func (x *PartyProposalVoteCount) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[98] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7889,7 +8078,7 @@ func (x *PartyProposalVoteCount) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyProposalVoteCount.ProtoReflect.Descriptor instead. func (*PartyProposalVoteCount) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{98} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{101} } func (x *PartyProposalVoteCount) GetParty() string { @@ -7925,7 +8114,7 @@ type PartyTokenBalance struct { func (x *PartyTokenBalance) Reset() { *x = PartyTokenBalance{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[99] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7938,7 +8127,7 @@ func (x *PartyTokenBalance) String() string { func (*PartyTokenBalance) ProtoMessage() {} func (x *PartyTokenBalance) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[99] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7951,7 +8140,7 @@ func (x *PartyTokenBalance) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyTokenBalance.ProtoReflect.Descriptor instead. func (*PartyTokenBalance) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{99} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{102} } func (x *PartyTokenBalance) GetParty() string { @@ -7980,7 +8169,7 @@ type BlockRejectStats struct { func (x *BlockRejectStats) Reset() { *x = BlockRejectStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[100] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7993,7 +8182,7 @@ func (x *BlockRejectStats) String() string { func (*BlockRejectStats) ProtoMessage() {} func (x *BlockRejectStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[100] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8006,7 +8195,7 @@ func (x *BlockRejectStats) ProtoReflect() protoreflect.Message { // Deprecated: Use BlockRejectStats.ProtoReflect.Descriptor instead. func (*BlockRejectStats) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{100} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{103} } func (x *BlockRejectStats) GetRejected() uint64 { @@ -8035,7 +8224,7 @@ type SpamPartyTransactionCount struct { func (x *SpamPartyTransactionCount) Reset() { *x = SpamPartyTransactionCount{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[101] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8048,7 +8237,7 @@ func (x *SpamPartyTransactionCount) String() string { func (*SpamPartyTransactionCount) ProtoMessage() {} func (x *SpamPartyTransactionCount) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[101] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8061,7 +8250,7 @@ func (x *SpamPartyTransactionCount) ProtoReflect() protoreflect.Message { // Deprecated: Use SpamPartyTransactionCount.ProtoReflect.Descriptor instead. func (*SpamPartyTransactionCount) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{101} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{104} } func (x *SpamPartyTransactionCount) GetParty() string { @@ -8093,7 +8282,7 @@ type SimpleSpamPolicy struct { func (x *SimpleSpamPolicy) Reset() { *x = SimpleSpamPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[102] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8106,7 +8295,7 @@ func (x *SimpleSpamPolicy) String() string { func (*SimpleSpamPolicy) ProtoMessage() {} func (x *SimpleSpamPolicy) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[102] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8119,7 +8308,7 @@ func (x *SimpleSpamPolicy) ProtoReflect() protoreflect.Message { // Deprecated: Use SimpleSpamPolicy.ProtoReflect.Descriptor instead. func (*SimpleSpamPolicy) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{102} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{105} } func (x *SimpleSpamPolicy) GetPolicyName() string { @@ -8172,7 +8361,7 @@ type NotarySigs struct { func (x *NotarySigs) Reset() { *x = NotarySigs{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[103] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8185,7 +8374,7 @@ func (x *NotarySigs) String() string { func (*NotarySigs) ProtoMessage() {} func (x *NotarySigs) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[103] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8198,7 +8387,7 @@ func (x *NotarySigs) ProtoReflect() protoreflect.Message { // Deprecated: Use NotarySigs.ProtoReflect.Descriptor instead. func (*NotarySigs) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{103} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{106} } func (x *NotarySigs) GetId() string { @@ -8247,7 +8436,7 @@ type Notary struct { func (x *Notary) Reset() { *x = Notary{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[104] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8260,7 +8449,7 @@ func (x *Notary) String() string { func (*Notary) ProtoMessage() {} func (x *Notary) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[104] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8273,7 +8462,7 @@ func (x *Notary) ProtoReflect() protoreflect.Message { // Deprecated: Use Notary.ProtoReflect.Descriptor instead. func (*Notary) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{104} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{107} } func (x *Notary) GetNotarySigs() []*NotarySigs { @@ -8294,7 +8483,7 @@ type StakeVerifierDeposited struct { func (x *StakeVerifierDeposited) Reset() { *x = StakeVerifierDeposited{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[105] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8307,7 +8496,7 @@ func (x *StakeVerifierDeposited) String() string { func (*StakeVerifierDeposited) ProtoMessage() {} func (x *StakeVerifierDeposited) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[105] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8320,7 +8509,7 @@ func (x *StakeVerifierDeposited) ProtoReflect() protoreflect.Message { // Deprecated: Use StakeVerifierDeposited.ProtoReflect.Descriptor instead. func (*StakeVerifierDeposited) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{105} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{108} } func (x *StakeVerifierDeposited) GetPendingDeposited() []*StakeVerifierPending { @@ -8341,7 +8530,7 @@ type StakeVerifierRemoved struct { func (x *StakeVerifierRemoved) Reset() { *x = StakeVerifierRemoved{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[106] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8354,7 +8543,7 @@ func (x *StakeVerifierRemoved) String() string { func (*StakeVerifierRemoved) ProtoMessage() {} func (x *StakeVerifierRemoved) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[106] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8367,7 +8556,7 @@ func (x *StakeVerifierRemoved) ProtoReflect() protoreflect.Message { // Deprecated: Use StakeVerifierRemoved.ProtoReflect.Descriptor instead. func (*StakeVerifierRemoved) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{106} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{109} } func (x *StakeVerifierRemoved) GetPendingRemoved() []*StakeVerifierPending { @@ -8395,7 +8584,7 @@ type StakeVerifierPending struct { func (x *StakeVerifierPending) Reset() { *x = StakeVerifierPending{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[107] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8408,7 +8597,7 @@ func (x *StakeVerifierPending) String() string { func (*StakeVerifierPending) ProtoMessage() {} func (x *StakeVerifierPending) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[107] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8421,7 +8610,7 @@ func (x *StakeVerifierPending) ProtoReflect() protoreflect.Message { // Deprecated: Use StakeVerifierPending.ProtoReflect.Descriptor instead. func (*StakeVerifierPending) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{107} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{110} } func (x *StakeVerifierPending) GetEthereumAddress() string { @@ -8491,7 +8680,7 @@ type L2EthOracles struct { func (x *L2EthOracles) Reset() { *x = L2EthOracles{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[108] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8504,7 +8693,7 @@ func (x *L2EthOracles) String() string { func (*L2EthOracles) ProtoMessage() {} func (x *L2EthOracles) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[108] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8517,7 +8706,7 @@ func (x *L2EthOracles) ProtoReflect() protoreflect.Message { // Deprecated: Use L2EthOracles.ProtoReflect.Descriptor instead. func (*L2EthOracles) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{108} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{111} } func (x *L2EthOracles) GetChainIdEthOracles() []*ChainIdEthOracles { @@ -8541,7 +8730,7 @@ type ChainIdEthOracles struct { func (x *ChainIdEthOracles) Reset() { *x = ChainIdEthOracles{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[109] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8554,7 +8743,7 @@ func (x *ChainIdEthOracles) String() string { func (*ChainIdEthOracles) ProtoMessage() {} func (x *ChainIdEthOracles) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[109] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8567,7 +8756,7 @@ func (x *ChainIdEthOracles) ProtoReflect() protoreflect.Message { // Deprecated: Use ChainIdEthOracles.ProtoReflect.Descriptor instead. func (*ChainIdEthOracles) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{109} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{112} } func (x *ChainIdEthOracles) GetSourceChainId() string { @@ -8610,7 +8799,7 @@ type EthOracleVerifierLastBlock struct { func (x *EthOracleVerifierLastBlock) Reset() { *x = EthOracleVerifierLastBlock{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[110] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8623,7 +8812,7 @@ func (x *EthOracleVerifierLastBlock) String() string { func (*EthOracleVerifierLastBlock) ProtoMessage() {} func (x *EthOracleVerifierLastBlock) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[110] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8636,7 +8825,7 @@ func (x *EthOracleVerifierLastBlock) ProtoReflect() protoreflect.Message { // Deprecated: Use EthOracleVerifierLastBlock.ProtoReflect.Descriptor instead. func (*EthOracleVerifierLastBlock) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{110} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{113} } func (x *EthOracleVerifierLastBlock) GetBlockHeight() uint64 { @@ -8665,7 +8854,7 @@ type EthOracleVerifierMisc struct { func (x *EthOracleVerifierMisc) Reset() { *x = EthOracleVerifierMisc{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[111] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8678,7 +8867,7 @@ func (x *EthOracleVerifierMisc) String() string { func (*EthOracleVerifierMisc) ProtoMessage() {} func (x *EthOracleVerifierMisc) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[111] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8691,7 +8880,7 @@ func (x *EthOracleVerifierMisc) ProtoReflect() protoreflect.Message { // Deprecated: Use EthOracleVerifierMisc.ProtoReflect.Descriptor instead. func (*EthOracleVerifierMisc) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{111} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{114} } func (x *EthOracleVerifierMisc) GetBuckets() []*EthVerifierBucket { @@ -8719,7 +8908,7 @@ type EthContractCallResults struct { func (x *EthContractCallResults) Reset() { *x = EthContractCallResults{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[112] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8732,7 +8921,7 @@ func (x *EthContractCallResults) String() string { func (*EthContractCallResults) ProtoMessage() {} func (x *EthContractCallResults) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[112] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8745,7 +8934,7 @@ func (x *EthContractCallResults) ProtoReflect() protoreflect.Message { // Deprecated: Use EthContractCallResults.ProtoReflect.Descriptor instead. func (*EthContractCallResults) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{112} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{115} } func (x *EthContractCallResults) GetPendingContractCallResult() []*EthContractCallResult { @@ -8771,7 +8960,7 @@ type EthContractCallResult struct { func (x *EthContractCallResult) Reset() { *x = EthContractCallResult{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[113] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8784,7 +8973,7 @@ func (x *EthContractCallResult) String() string { func (*EthContractCallResult) ProtoMessage() {} func (x *EthContractCallResult) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[113] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8797,7 +8986,7 @@ func (x *EthContractCallResult) ProtoReflect() protoreflect.Message { // Deprecated: Use EthContractCallResult.ProtoReflect.Descriptor instead. func (*EthContractCallResult) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{113} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{116} } func (x *EthContractCallResult) GetBlockHeight() uint64 { @@ -8854,7 +9043,7 @@ type EthVerifierBucket struct { func (x *EthVerifierBucket) Reset() { *x = EthVerifierBucket{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[114] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8867,7 +9056,7 @@ func (x *EthVerifierBucket) String() string { func (*EthVerifierBucket) ProtoMessage() {} func (x *EthVerifierBucket) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[114] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8880,7 +9069,7 @@ func (x *EthVerifierBucket) ProtoReflect() protoreflect.Message { // Deprecated: Use EthVerifierBucket.ProtoReflect.Descriptor instead. func (*EthVerifierBucket) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{114} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{117} } func (x *EthVerifierBucket) GetTs() int64 { @@ -8911,7 +9100,7 @@ type PendingKeyRotation struct { func (x *PendingKeyRotation) Reset() { *x = PendingKeyRotation{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[115] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8924,7 +9113,7 @@ func (x *PendingKeyRotation) String() string { func (*PendingKeyRotation) ProtoMessage() {} func (x *PendingKeyRotation) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[115] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8937,7 +9126,7 @@ func (x *PendingKeyRotation) ProtoReflect() protoreflect.Message { // Deprecated: Use PendingKeyRotation.ProtoReflect.Descriptor instead. func (*PendingKeyRotation) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{115} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{118} } func (x *PendingKeyRotation) GetBlockHeight() uint64 { @@ -8983,7 +9172,7 @@ type PendingEthereumKeyRotation struct { func (x *PendingEthereumKeyRotation) Reset() { *x = PendingEthereumKeyRotation{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[116] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8996,7 +9185,7 @@ func (x *PendingEthereumKeyRotation) String() string { func (*PendingEthereumKeyRotation) ProtoMessage() {} func (x *PendingEthereumKeyRotation) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[116] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9009,7 +9198,7 @@ func (x *PendingEthereumKeyRotation) ProtoReflect() protoreflect.Message { // Deprecated: Use PendingEthereumKeyRotation.ProtoReflect.Descriptor instead. func (*PendingEthereumKeyRotation) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{116} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{119} } func (x *PendingEthereumKeyRotation) GetBlockHeight() uint64 { @@ -9064,7 +9253,7 @@ type Topology struct { func (x *Topology) Reset() { *x = Topology{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[117] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9077,7 +9266,7 @@ func (x *Topology) String() string { func (*Topology) ProtoMessage() {} func (x *Topology) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[117] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9090,7 +9279,7 @@ func (x *Topology) ProtoReflect() protoreflect.Message { // Deprecated: Use Topology.ProtoReflect.Descriptor instead. func (*Topology) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{117} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{120} } func (x *Topology) GetValidatorData() []*ValidatorState { @@ -9154,7 +9343,7 @@ type ToplogySignatures struct { func (x *ToplogySignatures) Reset() { *x = ToplogySignatures{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[118] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9167,7 +9356,7 @@ func (x *ToplogySignatures) String() string { func (*ToplogySignatures) ProtoMessage() {} func (x *ToplogySignatures) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[118] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9180,7 +9369,7 @@ func (x *ToplogySignatures) ProtoReflect() protoreflect.Message { // Deprecated: Use ToplogySignatures.ProtoReflect.Descriptor instead. func (*ToplogySignatures) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{118} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{121} } func (x *ToplogySignatures) GetPendingSignatures() []*PendingERC20MultisigControlSignature { @@ -9212,7 +9401,7 @@ type PendingERC20MultisigControlSignature struct { func (x *PendingERC20MultisigControlSignature) Reset() { *x = PendingERC20MultisigControlSignature{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[119] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9225,7 +9414,7 @@ func (x *PendingERC20MultisigControlSignature) String() string { func (*PendingERC20MultisigControlSignature) ProtoMessage() {} func (x *PendingERC20MultisigControlSignature) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[119] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9238,7 +9427,7 @@ func (x *PendingERC20MultisigControlSignature) ProtoReflect() protoreflect.Messa // Deprecated: Use PendingERC20MultisigControlSignature.ProtoReflect.Descriptor instead. func (*PendingERC20MultisigControlSignature) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{119} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{122} } func (x *PendingERC20MultisigControlSignature) GetNodeId() string { @@ -9290,7 +9479,7 @@ type IssuedERC20MultisigControlSignature struct { func (x *IssuedERC20MultisigControlSignature) Reset() { *x = IssuedERC20MultisigControlSignature{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[120] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9303,7 +9492,7 @@ func (x *IssuedERC20MultisigControlSignature) String() string { func (*IssuedERC20MultisigControlSignature) ProtoMessage() {} func (x *IssuedERC20MultisigControlSignature) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[120] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9316,7 +9505,7 @@ func (x *IssuedERC20MultisigControlSignature) ProtoReflect() protoreflect.Messag // Deprecated: Use IssuedERC20MultisigControlSignature.ProtoReflect.Descriptor instead. func (*IssuedERC20MultisigControlSignature) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{120} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{123} } func (x *IssuedERC20MultisigControlSignature) GetResourceId() string { @@ -9366,7 +9555,7 @@ type ValidatorState struct { func (x *ValidatorState) Reset() { *x = ValidatorState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[121] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9379,7 +9568,7 @@ func (x *ValidatorState) String() string { func (*ValidatorState) ProtoMessage() {} func (x *ValidatorState) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[121] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9392,7 +9581,7 @@ func (x *ValidatorState) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatorState.ProtoReflect.Descriptor instead. func (*ValidatorState) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{121} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{124} } func (x *ValidatorState) GetValidatorUpdate() *v12.ValidatorUpdate { @@ -9472,7 +9661,7 @@ type HeartbeatTracker struct { func (x *HeartbeatTracker) Reset() { *x = HeartbeatTracker{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[122] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9485,7 +9674,7 @@ func (x *HeartbeatTracker) String() string { func (*HeartbeatTracker) ProtoMessage() {} func (x *HeartbeatTracker) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[122] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9498,7 +9687,7 @@ func (x *HeartbeatTracker) ProtoReflect() protoreflect.Message { // Deprecated: Use HeartbeatTracker.ProtoReflect.Descriptor instead. func (*HeartbeatTracker) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{122} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{125} } func (x *HeartbeatTracker) GetExpectedNextHash() string { @@ -9546,7 +9735,7 @@ type PerformanceStats struct { func (x *PerformanceStats) Reset() { *x = PerformanceStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[123] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9559,7 +9748,7 @@ func (x *PerformanceStats) String() string { func (*PerformanceStats) ProtoMessage() {} func (x *PerformanceStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[123] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9572,7 +9761,7 @@ func (x *PerformanceStats) ProtoReflect() protoreflect.Message { // Deprecated: Use PerformanceStats.ProtoReflect.Descriptor instead. func (*PerformanceStats) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{123} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{126} } func (x *PerformanceStats) GetValidatorAddress() string { @@ -9635,7 +9824,7 @@ type ValidatorPerformance struct { func (x *ValidatorPerformance) Reset() { *x = ValidatorPerformance{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[124] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9648,7 +9837,7 @@ func (x *ValidatorPerformance) String() string { func (*ValidatorPerformance) ProtoMessage() {} func (x *ValidatorPerformance) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[124] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9661,7 +9850,7 @@ func (x *ValidatorPerformance) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatorPerformance.ProtoReflect.Descriptor instead. func (*ValidatorPerformance) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{124} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{127} } func (x *ValidatorPerformance) GetValidatorPerfStats() []*PerformanceStats { @@ -9686,7 +9875,7 @@ type LiquidityParameters struct { func (x *LiquidityParameters) Reset() { *x = LiquidityParameters{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[125] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9699,7 +9888,7 @@ func (x *LiquidityParameters) String() string { func (*LiquidityParameters) ProtoMessage() {} func (x *LiquidityParameters) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[125] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[128] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9712,7 +9901,7 @@ func (x *LiquidityParameters) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityParameters.ProtoReflect.Descriptor instead. func (*LiquidityParameters) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{125} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{128} } func (x *LiquidityParameters) GetMaxFee() string { @@ -9756,7 +9945,7 @@ type LiquidityPendingProvisions struct { func (x *LiquidityPendingProvisions) Reset() { *x = LiquidityPendingProvisions{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[126] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9769,7 +9958,7 @@ func (x *LiquidityPendingProvisions) String() string { func (*LiquidityPendingProvisions) ProtoMessage() {} func (x *LiquidityPendingProvisions) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[126] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[129] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9782,7 +9971,7 @@ func (x *LiquidityPendingProvisions) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityPendingProvisions.ProtoReflect.Descriptor instead. func (*LiquidityPendingProvisions) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{126} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{129} } func (x *LiquidityPendingProvisions) GetPendingProvisions() []string { @@ -9812,7 +10001,7 @@ type LiquidityPartiesLiquidityOrders struct { func (x *LiquidityPartiesLiquidityOrders) Reset() { *x = LiquidityPartiesLiquidityOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[127] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9825,7 +10014,7 @@ func (x *LiquidityPartiesLiquidityOrders) String() string { func (*LiquidityPartiesLiquidityOrders) ProtoMessage() {} func (x *LiquidityPartiesLiquidityOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[127] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[130] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9838,7 +10027,7 @@ func (x *LiquidityPartiesLiquidityOrders) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityPartiesLiquidityOrders.ProtoReflect.Descriptor instead. func (*LiquidityPartiesLiquidityOrders) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{127} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{130} } func (x *LiquidityPartiesLiquidityOrders) GetPartyOrders() []*PartyOrders { @@ -9867,7 +10056,7 @@ type PartyOrders struct { func (x *PartyOrders) Reset() { *x = PartyOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[128] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9880,7 +10069,7 @@ func (x *PartyOrders) String() string { func (*PartyOrders) ProtoMessage() {} func (x *PartyOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[128] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[131] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9893,7 +10082,7 @@ func (x *PartyOrders) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyOrders.ProtoReflect.Descriptor instead. func (*PartyOrders) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{128} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{131} } func (x *PartyOrders) GetParty() string { @@ -9923,7 +10112,7 @@ type LiquidityPartiesOrders struct { func (x *LiquidityPartiesOrders) Reset() { *x = LiquidityPartiesOrders{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[129] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9936,7 +10125,7 @@ func (x *LiquidityPartiesOrders) String() string { func (*LiquidityPartiesOrders) ProtoMessage() {} func (x *LiquidityPartiesOrders) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[129] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[132] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9949,7 +10138,7 @@ func (x *LiquidityPartiesOrders) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityPartiesOrders.ProtoReflect.Descriptor instead. func (*LiquidityPartiesOrders) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{129} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{132} } func (x *LiquidityPartiesOrders) GetPartyOrders() []*PartyOrders { @@ -9979,7 +10168,7 @@ type LiquidityProvisions struct { func (x *LiquidityProvisions) Reset() { *x = LiquidityProvisions{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[130] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9992,7 +10181,7 @@ func (x *LiquidityProvisions) String() string { func (*LiquidityProvisions) ProtoMessage() {} func (x *LiquidityProvisions) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[130] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[133] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10005,7 +10194,7 @@ func (x *LiquidityProvisions) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityProvisions.ProtoReflect.Descriptor instead. func (*LiquidityProvisions) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{130} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{133} } func (x *LiquidityProvisions) GetLiquidityProvisions() []*vega.LiquidityProvision { @@ -10035,7 +10224,7 @@ type LiquidityScores struct { func (x *LiquidityScores) Reset() { *x = LiquidityScores{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[131] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10048,7 +10237,7 @@ func (x *LiquidityScores) String() string { func (*LiquidityScores) ProtoMessage() {} func (x *LiquidityScores) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[131] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[134] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10061,7 +10250,7 @@ func (x *LiquidityScores) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityScores.ProtoReflect.Descriptor instead. func (*LiquidityScores) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{131} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{134} } func (x *LiquidityScores) GetRunningAverageCounter() int32 { @@ -10097,7 +10286,7 @@ type LiquidityScore struct { func (x *LiquidityScore) Reset() { *x = LiquidityScore{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[132] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10110,7 +10299,7 @@ func (x *LiquidityScore) String() string { func (*LiquidityScore) ProtoMessage() {} func (x *LiquidityScore) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[132] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[135] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10123,7 +10312,7 @@ func (x *LiquidityScore) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityScore.ProtoReflect.Descriptor instead. func (*LiquidityScore) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{132} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{135} } func (x *LiquidityScore) GetScore() string { @@ -10160,7 +10349,7 @@ type LiquidityV2Parameters struct { func (x *LiquidityV2Parameters) Reset() { *x = LiquidityV2Parameters{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[133] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10173,7 +10362,7 @@ func (x *LiquidityV2Parameters) String() string { func (*LiquidityV2Parameters) ProtoMessage() {} func (x *LiquidityV2Parameters) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[133] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[136] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10186,7 +10375,7 @@ func (x *LiquidityV2Parameters) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityV2Parameters.ProtoReflect.Descriptor instead. func (*LiquidityV2Parameters) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{133} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{136} } func (x *LiquidityV2Parameters) GetMarketId() string { @@ -10237,7 +10426,7 @@ type LiquidityV2PaidFeesStats struct { func (x *LiquidityV2PaidFeesStats) Reset() { *x = LiquidityV2PaidFeesStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[134] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10250,7 +10439,7 @@ func (x *LiquidityV2PaidFeesStats) String() string { func (*LiquidityV2PaidFeesStats) ProtoMessage() {} func (x *LiquidityV2PaidFeesStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[134] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[137] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10263,7 +10452,7 @@ func (x *LiquidityV2PaidFeesStats) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityV2PaidFeesStats.ProtoReflect.Descriptor instead. func (*LiquidityV2PaidFeesStats) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{134} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{137} } func (x *LiquidityV2PaidFeesStats) GetMarketId() string { @@ -10293,7 +10482,7 @@ type LiquidityV2Provisions struct { func (x *LiquidityV2Provisions) Reset() { *x = LiquidityV2Provisions{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[135] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10306,7 +10495,7 @@ func (x *LiquidityV2Provisions) String() string { func (*LiquidityV2Provisions) ProtoMessage() {} func (x *LiquidityV2Provisions) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[135] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[138] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10319,7 +10508,7 @@ func (x *LiquidityV2Provisions) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityV2Provisions.ProtoReflect.Descriptor instead. func (*LiquidityV2Provisions) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{135} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{138} } func (x *LiquidityV2Provisions) GetMarketId() string { @@ -10349,7 +10538,7 @@ type LiquidityV2PendingProvisions struct { func (x *LiquidityV2PendingProvisions) Reset() { *x = LiquidityV2PendingProvisions{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[136] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10362,7 +10551,7 @@ func (x *LiquidityV2PendingProvisions) String() string { func (*LiquidityV2PendingProvisions) ProtoMessage() {} func (x *LiquidityV2PendingProvisions) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[136] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[139] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10375,7 +10564,7 @@ func (x *LiquidityV2PendingProvisions) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityV2PendingProvisions.ProtoReflect.Descriptor instead. func (*LiquidityV2PendingProvisions) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{136} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{139} } func (x *LiquidityV2PendingProvisions) GetMarketId() string { @@ -10406,7 +10595,7 @@ type LiquidityV2Performances struct { func (x *LiquidityV2Performances) Reset() { *x = LiquidityV2Performances{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[137] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10419,7 +10608,7 @@ func (x *LiquidityV2Performances) String() string { func (*LiquidityV2Performances) ProtoMessage() {} func (x *LiquidityV2Performances) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[137] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[140] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10432,7 +10621,7 @@ func (x *LiquidityV2Performances) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityV2Performances.ProtoReflect.Descriptor instead. func (*LiquidityV2Performances) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{137} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{140} } func (x *LiquidityV2Performances) GetMarketId() string { @@ -10477,7 +10666,7 @@ type LiquidityV2PerformancePerParty struct { func (x *LiquidityV2PerformancePerParty) Reset() { *x = LiquidityV2PerformancePerParty{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[138] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10490,7 +10679,7 @@ func (x *LiquidityV2PerformancePerParty) String() string { func (*LiquidityV2PerformancePerParty) ProtoMessage() {} func (x *LiquidityV2PerformancePerParty) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[138] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[141] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10503,7 +10692,7 @@ func (x *LiquidityV2PerformancePerParty) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityV2PerformancePerParty.ProtoReflect.Descriptor instead. func (*LiquidityV2PerformancePerParty) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{138} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{141} } func (x *LiquidityV2PerformancePerParty) GetParty() string { @@ -10599,7 +10788,7 @@ type LiquidityV2Scores struct { func (x *LiquidityV2Scores) Reset() { *x = LiquidityV2Scores{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[139] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10612,7 +10801,7 @@ func (x *LiquidityV2Scores) String() string { func (*LiquidityV2Scores) ProtoMessage() {} func (x *LiquidityV2Scores) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[139] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[142] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10625,7 +10814,7 @@ func (x *LiquidityV2Scores) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityV2Scores.ProtoReflect.Descriptor instead. func (*LiquidityV2Scores) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{139} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{142} } func (x *LiquidityV2Scores) GetMarketId() string { @@ -10678,7 +10867,7 @@ type LiquidityV2Supplied struct { func (x *LiquidityV2Supplied) Reset() { *x = LiquidityV2Supplied{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[140] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10691,7 +10880,7 @@ func (x *LiquidityV2Supplied) String() string { func (*LiquidityV2Supplied) ProtoMessage() {} func (x *LiquidityV2Supplied) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[140] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[143] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10704,7 +10893,7 @@ func (x *LiquidityV2Supplied) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityV2Supplied.ProtoReflect.Descriptor instead. func (*LiquidityV2Supplied) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{140} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{143} } func (x *LiquidityV2Supplied) GetMarketId() string { @@ -10748,7 +10937,7 @@ type FloatingPointConsensus struct { func (x *FloatingPointConsensus) Reset() { *x = FloatingPointConsensus{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[141] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10761,7 +10950,7 @@ func (x *FloatingPointConsensus) String() string { func (*FloatingPointConsensus) ProtoMessage() {} func (x *FloatingPointConsensus) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[141] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[144] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10774,7 +10963,7 @@ func (x *FloatingPointConsensus) ProtoReflect() protoreflect.Message { // Deprecated: Use FloatingPointConsensus.ProtoReflect.Descriptor instead. func (*FloatingPointConsensus) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{141} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{144} } func (x *FloatingPointConsensus) GetNextTimeTrigger() []*NextTimeTrigger { @@ -10806,7 +10995,7 @@ type StateVarInternalState struct { func (x *StateVarInternalState) Reset() { *x = StateVarInternalState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[142] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10819,7 +11008,7 @@ func (x *StateVarInternalState) String() string { func (*StateVarInternalState) ProtoMessage() {} func (x *StateVarInternalState) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[142] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[145] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10832,7 +11021,7 @@ func (x *StateVarInternalState) ProtoReflect() protoreflect.Message { // Deprecated: Use StateVarInternalState.ProtoReflect.Descriptor instead. func (*StateVarInternalState) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{142} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{145} } func (x *StateVarInternalState) GetId() string { @@ -10882,7 +11071,7 @@ type FloatingPointValidatorResult struct { func (x *FloatingPointValidatorResult) Reset() { *x = FloatingPointValidatorResult{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[143] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[146] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10895,7 +11084,7 @@ func (x *FloatingPointValidatorResult) String() string { func (*FloatingPointValidatorResult) ProtoMessage() {} func (x *FloatingPointValidatorResult) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[143] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[146] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10908,7 +11097,7 @@ func (x *FloatingPointValidatorResult) ProtoReflect() protoreflect.Message { // Deprecated: Use FloatingPointValidatorResult.ProtoReflect.Descriptor instead. func (*FloatingPointValidatorResult) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{143} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{146} } func (x *FloatingPointValidatorResult) GetId() string { @@ -10939,7 +11128,7 @@ type NextTimeTrigger struct { func (x *NextTimeTrigger) Reset() { *x = NextTimeTrigger{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[144] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[147] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10952,7 +11141,7 @@ func (x *NextTimeTrigger) String() string { func (*NextTimeTrigger) ProtoMessage() {} func (x *NextTimeTrigger) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[144] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[147] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10965,7 +11154,7 @@ func (x *NextTimeTrigger) ProtoReflect() protoreflect.Message { // Deprecated: Use NextTimeTrigger.ProtoReflect.Descriptor instead. func (*NextTimeTrigger) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{144} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{147} } func (x *NextTimeTrigger) GetAsset() string { @@ -11010,7 +11199,7 @@ type MarketTracker struct { func (x *MarketTracker) Reset() { *x = MarketTracker{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[145] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[148] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11023,7 +11212,7 @@ func (x *MarketTracker) String() string { func (*MarketTracker) ProtoMessage() {} func (x *MarketTracker) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[145] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[148] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11036,7 +11225,7 @@ func (x *MarketTracker) ProtoReflect() protoreflect.Message { // Deprecated: Use MarketTracker.ProtoReflect.Descriptor instead. func (*MarketTracker) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{145} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{148} } func (x *MarketTracker) GetMarketActivity() []*v11.MarketActivityTracker { @@ -11079,7 +11268,7 @@ type SignerEventsPerAddress struct { func (x *SignerEventsPerAddress) Reset() { *x = SignerEventsPerAddress{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[146] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[149] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11092,7 +11281,7 @@ func (x *SignerEventsPerAddress) String() string { func (*SignerEventsPerAddress) ProtoMessage() {} func (x *SignerEventsPerAddress) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[146] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[149] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11105,7 +11294,7 @@ func (x *SignerEventsPerAddress) ProtoReflect() protoreflect.Message { // Deprecated: Use SignerEventsPerAddress.ProtoReflect.Descriptor instead. func (*SignerEventsPerAddress) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{146} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{149} } func (x *SignerEventsPerAddress) GetAddress() string { @@ -11136,7 +11325,7 @@ type ERC20MultiSigTopologyVerified struct { func (x *ERC20MultiSigTopologyVerified) Reset() { *x = ERC20MultiSigTopologyVerified{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[147] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[150] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11149,7 +11338,7 @@ func (x *ERC20MultiSigTopologyVerified) String() string { func (*ERC20MultiSigTopologyVerified) ProtoMessage() {} func (x *ERC20MultiSigTopologyVerified) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[147] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[150] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11162,7 +11351,7 @@ func (x *ERC20MultiSigTopologyVerified) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20MultiSigTopologyVerified.ProtoReflect.Descriptor instead. func (*ERC20MultiSigTopologyVerified) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{147} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{150} } func (x *ERC20MultiSigTopologyVerified) GetSigners() []string { @@ -11207,7 +11396,7 @@ type ERC20MultiSigTopologyPending struct { func (x *ERC20MultiSigTopologyPending) Reset() { *x = ERC20MultiSigTopologyPending{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[148] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[151] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11220,7 +11409,7 @@ func (x *ERC20MultiSigTopologyPending) String() string { func (*ERC20MultiSigTopologyPending) ProtoMessage() {} func (x *ERC20MultiSigTopologyPending) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[148] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[151] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11233,7 +11422,7 @@ func (x *ERC20MultiSigTopologyPending) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20MultiSigTopologyPending.ProtoReflect.Descriptor instead. func (*ERC20MultiSigTopologyPending) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{148} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{151} } func (x *ERC20MultiSigTopologyPending) GetPendingSigners() []*v12.ERC20MultiSigSignerEvent { @@ -11277,7 +11466,7 @@ type EVMMultisigTopology struct { func (x *EVMMultisigTopology) Reset() { *x = EVMMultisigTopology{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[149] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[152] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11290,7 +11479,7 @@ func (x *EVMMultisigTopology) String() string { func (*EVMMultisigTopology) ProtoMessage() {} func (x *EVMMultisigTopology) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[149] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[152] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11303,7 +11492,7 @@ func (x *EVMMultisigTopology) ProtoReflect() protoreflect.Message { // Deprecated: Use EVMMultisigTopology.ProtoReflect.Descriptor instead. func (*EVMMultisigTopology) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{149} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{152} } func (x *EVMMultisigTopology) GetChainId() string { @@ -11338,7 +11527,7 @@ type EVMMultisigTopologies struct { func (x *EVMMultisigTopologies) Reset() { *x = EVMMultisigTopologies{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[150] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[153] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11351,7 +11540,7 @@ func (x *EVMMultisigTopologies) String() string { func (*EVMMultisigTopologies) ProtoMessage() {} func (x *EVMMultisigTopologies) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[150] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[153] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11364,7 +11553,7 @@ func (x *EVMMultisigTopologies) ProtoReflect() protoreflect.Message { // Deprecated: Use EVMMultisigTopologies.ProtoReflect.Descriptor instead. func (*EVMMultisigTopologies) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{150} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{153} } func (x *EVMMultisigTopologies) GetEvmMultisigTopology() []*EVMMultisigTopology { @@ -11393,7 +11582,7 @@ type ProofOfWork struct { func (x *ProofOfWork) Reset() { *x = ProofOfWork{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[151] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[154] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11406,7 +11595,7 @@ func (x *ProofOfWork) String() string { func (*ProofOfWork) ProtoMessage() {} func (x *ProofOfWork) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[151] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[154] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11419,7 +11608,7 @@ func (x *ProofOfWork) ProtoReflect() protoreflect.Message { // Deprecated: Use ProofOfWork.ProtoReflect.Descriptor instead. func (*ProofOfWork) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{151} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{154} } func (x *ProofOfWork) GetBlockHeight() []uint64 { @@ -11497,7 +11686,7 @@ type BannedParty struct { func (x *BannedParty) Reset() { *x = BannedParty{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[152] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[155] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11510,7 +11699,7 @@ func (x *BannedParty) String() string { func (*BannedParty) ProtoMessage() {} func (x *BannedParty) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[152] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[155] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11523,7 +11712,7 @@ func (x *BannedParty) ProtoReflect() protoreflect.Message { // Deprecated: Use BannedParty.ProtoReflect.Descriptor instead. func (*BannedParty) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{152} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{155} } func (x *BannedParty) GetParty() string { @@ -11557,7 +11746,7 @@ type ProofOfWorkParams struct { func (x *ProofOfWorkParams) Reset() { *x = ProofOfWorkParams{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[153] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[156] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11570,7 +11759,7 @@ func (x *ProofOfWorkParams) String() string { func (*ProofOfWorkParams) ProtoMessage() {} func (x *ProofOfWorkParams) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[153] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[156] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11583,7 +11772,7 @@ func (x *ProofOfWorkParams) ProtoReflect() protoreflect.Message { // Deprecated: Use ProofOfWorkParams.ProtoReflect.Descriptor instead. func (*ProofOfWorkParams) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{153} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{156} } func (x *ProofOfWorkParams) GetSpamPowNumberOfPastBlocks() uint64 { @@ -11646,7 +11835,7 @@ type ProofOfWorkState struct { func (x *ProofOfWorkState) Reset() { *x = ProofOfWorkState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[154] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[157] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11659,7 +11848,7 @@ func (x *ProofOfWorkState) String() string { func (*ProofOfWorkState) ProtoMessage() {} func (x *ProofOfWorkState) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[154] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[157] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11672,7 +11861,7 @@ func (x *ProofOfWorkState) ProtoReflect() protoreflect.Message { // Deprecated: Use ProofOfWorkState.ProtoReflect.Descriptor instead. func (*ProofOfWorkState) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{154} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{157} } func (x *ProofOfWorkState) GetPowState() []*ProofOfWorkBlockState { @@ -11694,7 +11883,7 @@ type ProofOfWorkBlockState struct { func (x *ProofOfWorkBlockState) Reset() { *x = ProofOfWorkBlockState{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[155] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[158] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11707,7 +11896,7 @@ func (x *ProofOfWorkBlockState) String() string { func (*ProofOfWorkBlockState) ProtoMessage() {} func (x *ProofOfWorkBlockState) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[155] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[158] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11720,7 +11909,7 @@ func (x *ProofOfWorkBlockState) ProtoReflect() protoreflect.Message { // Deprecated: Use ProofOfWorkBlockState.ProtoReflect.Descriptor instead. func (*ProofOfWorkBlockState) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{155} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{158} } func (x *ProofOfWorkBlockState) GetBlockHeight() uint64 { @@ -11750,7 +11939,7 @@ type ProofOfWorkPartyStateForBlock struct { func (x *ProofOfWorkPartyStateForBlock) Reset() { *x = ProofOfWorkPartyStateForBlock{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[156] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[159] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11763,7 +11952,7 @@ func (x *ProofOfWorkPartyStateForBlock) String() string { func (*ProofOfWorkPartyStateForBlock) ProtoMessage() {} func (x *ProofOfWorkPartyStateForBlock) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[156] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[159] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11776,7 +11965,7 @@ func (x *ProofOfWorkPartyStateForBlock) ProtoReflect() protoreflect.Message { // Deprecated: Use ProofOfWorkPartyStateForBlock.ProtoReflect.Descriptor instead. func (*ProofOfWorkPartyStateForBlock) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{156} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{159} } func (x *ProofOfWorkPartyStateForBlock) GetParty() string { @@ -11812,7 +12001,7 @@ type TransactionsAtHeight struct { func (x *TransactionsAtHeight) Reset() { *x = TransactionsAtHeight{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[157] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[160] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11825,7 +12014,7 @@ func (x *TransactionsAtHeight) String() string { func (*TransactionsAtHeight) ProtoMessage() {} func (x *TransactionsAtHeight) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[157] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[160] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11838,7 +12027,7 @@ func (x *TransactionsAtHeight) ProtoReflect() protoreflect.Message { // Deprecated: Use TransactionsAtHeight.ProtoReflect.Descriptor instead. func (*TransactionsAtHeight) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{157} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{160} } func (x *TransactionsAtHeight) GetHeight() uint64 { @@ -11867,7 +12056,7 @@ type NonceRef struct { func (x *NonceRef) Reset() { *x = NonceRef{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[158] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[161] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11880,7 +12069,7 @@ func (x *NonceRef) String() string { func (*NonceRef) ProtoMessage() {} func (x *NonceRef) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[158] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[161] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11893,7 +12082,7 @@ func (x *NonceRef) ProtoReflect() protoreflect.Message { // Deprecated: Use NonceRef.ProtoReflect.Descriptor instead. func (*NonceRef) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{158} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{161} } func (x *NonceRef) GetParty() string { @@ -11922,7 +12111,7 @@ type NonceRefsAtHeight struct { func (x *NonceRefsAtHeight) Reset() { *x = NonceRefsAtHeight{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[159] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[162] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11935,7 +12124,7 @@ func (x *NonceRefsAtHeight) String() string { func (*NonceRefsAtHeight) ProtoMessage() {} func (x *NonceRefsAtHeight) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[159] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[162] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11948,7 +12137,7 @@ func (x *NonceRefsAtHeight) ProtoReflect() protoreflect.Message { // Deprecated: Use NonceRefsAtHeight.ProtoReflect.Descriptor instead. func (*NonceRefsAtHeight) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{159} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{162} } func (x *NonceRefsAtHeight) GetHeight() uint64 { @@ -11977,7 +12166,7 @@ type ProtocolUpgradeProposals struct { func (x *ProtocolUpgradeProposals) Reset() { *x = ProtocolUpgradeProposals{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[160] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[163] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11990,7 +12179,7 @@ func (x *ProtocolUpgradeProposals) String() string { func (*ProtocolUpgradeProposals) ProtoMessage() {} func (x *ProtocolUpgradeProposals) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[160] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[163] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12003,7 +12192,7 @@ func (x *ProtocolUpgradeProposals) ProtoReflect() protoreflect.Message { // Deprecated: Use ProtocolUpgradeProposals.ProtoReflect.Descriptor instead. func (*ProtocolUpgradeProposals) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{160} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{163} } func (x *ProtocolUpgradeProposals) GetActiveProposals() []*v12.ProtocolUpgradeEvent { @@ -12034,7 +12223,7 @@ type AcceptedProtocolUpgradeProposal struct { func (x *AcceptedProtocolUpgradeProposal) Reset() { *x = AcceptedProtocolUpgradeProposal{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[161] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[164] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12047,7 +12236,7 @@ func (x *AcceptedProtocolUpgradeProposal) String() string { func (*AcceptedProtocolUpgradeProposal) ProtoMessage() {} func (x *AcceptedProtocolUpgradeProposal) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[161] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[164] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12060,7 +12249,7 @@ func (x *AcceptedProtocolUpgradeProposal) ProtoReflect() protoreflect.Message { // Deprecated: Use AcceptedProtocolUpgradeProposal.ProtoReflect.Descriptor instead. func (*AcceptedProtocolUpgradeProposal) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{161} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{164} } func (x *AcceptedProtocolUpgradeProposal) GetUpgradeBlockHeight() uint64 { @@ -12088,7 +12277,7 @@ type Teams struct { func (x *Teams) Reset() { *x = Teams{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[162] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[165] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12101,7 +12290,7 @@ func (x *Teams) String() string { func (*Teams) ProtoMessage() {} func (x *Teams) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[162] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[165] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12114,7 +12303,7 @@ func (x *Teams) ProtoReflect() protoreflect.Message { // Deprecated: Use Teams.ProtoReflect.Descriptor instead. func (*Teams) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{162} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{165} } func (x *Teams) GetTeams() []*Team { @@ -12143,7 +12332,7 @@ type Team struct { func (x *Team) Reset() { *x = Team{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[163] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[166] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12156,7 +12345,7 @@ func (x *Team) String() string { func (*Team) ProtoMessage() {} func (x *Team) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[163] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[166] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12169,7 +12358,7 @@ func (x *Team) ProtoReflect() protoreflect.Message { // Deprecated: Use Team.ProtoReflect.Descriptor instead. func (*Team) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{163} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{166} } func (x *Team) GetId() string { @@ -12248,7 +12437,7 @@ type Membership struct { func (x *Membership) Reset() { *x = Membership{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[164] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[167] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12261,7 +12450,7 @@ func (x *Membership) String() string { func (*Membership) ProtoMessage() {} func (x *Membership) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[164] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[167] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12274,7 +12463,7 @@ func (x *Membership) ProtoReflect() protoreflect.Message { // Deprecated: Use Membership.ProtoReflect.Descriptor instead. func (*Membership) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{164} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{167} } func (x *Membership) GetPartyId() string { @@ -12309,7 +12498,7 @@ type TeamSwitches struct { func (x *TeamSwitches) Reset() { *x = TeamSwitches{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[165] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[168] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12322,7 +12511,7 @@ func (x *TeamSwitches) String() string { func (*TeamSwitches) ProtoMessage() {} func (x *TeamSwitches) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[165] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[168] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12335,7 +12524,7 @@ func (x *TeamSwitches) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamSwitches.ProtoReflect.Descriptor instead. func (*TeamSwitches) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{165} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{168} } func (x *TeamSwitches) GetTeamSwitches() []*TeamSwitch { @@ -12358,7 +12547,7 @@ type TeamSwitch struct { func (x *TeamSwitch) Reset() { *x = TeamSwitch{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[166] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[169] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12371,7 +12560,7 @@ func (x *TeamSwitch) String() string { func (*TeamSwitch) ProtoMessage() {} func (x *TeamSwitch) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[166] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[169] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12384,7 +12573,7 @@ func (x *TeamSwitch) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamSwitch.ProtoReflect.Descriptor instead. func (*TeamSwitch) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{166} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{169} } func (x *TeamSwitch) GetFromTeamId() string { @@ -12419,7 +12608,7 @@ type Vesting struct { func (x *Vesting) Reset() { *x = Vesting{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[167] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[170] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12432,7 +12621,7 @@ func (x *Vesting) String() string { func (*Vesting) ProtoMessage() {} func (x *Vesting) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[167] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[170] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12445,7 +12634,7 @@ func (x *Vesting) ProtoReflect() protoreflect.Message { // Deprecated: Use Vesting.ProtoReflect.Descriptor instead. func (*Vesting) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{167} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{170} } func (x *Vesting) GetPartiesReward() []*PartyReward { @@ -12468,7 +12657,7 @@ type PartyReward struct { func (x *PartyReward) Reset() { *x = PartyReward{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[168] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[171] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12481,7 +12670,7 @@ func (x *PartyReward) String() string { func (*PartyReward) ProtoMessage() {} func (x *PartyReward) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[168] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[171] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12494,7 +12683,7 @@ func (x *PartyReward) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyReward.ProtoReflect.Descriptor instead. func (*PartyReward) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{168} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{171} } func (x *PartyReward) GetParty() string { @@ -12534,7 +12723,7 @@ type ReferralProgramData struct { func (x *ReferralProgramData) Reset() { *x = ReferralProgramData{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[169] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[172] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12547,7 +12736,7 @@ func (x *ReferralProgramData) String() string { func (*ReferralProgramData) ProtoMessage() {} func (x *ReferralProgramData) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[169] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[172] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12560,7 +12749,7 @@ func (x *ReferralProgramData) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralProgramData.ProtoReflect.Descriptor instead. func (*ReferralProgramData) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{169} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{172} } func (x *ReferralProgramData) GetFactorByReferee() []*FactorByReferee { @@ -12624,7 +12813,7 @@ type ReferralSet struct { func (x *ReferralSet) Reset() { *x = ReferralSet{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[170] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[173] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12637,7 +12826,7 @@ func (x *ReferralSet) String() string { func (*ReferralSet) ProtoMessage() {} func (x *ReferralSet) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[170] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[173] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12650,7 +12839,7 @@ func (x *ReferralSet) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralSet.ProtoReflect.Descriptor instead. func (*ReferralSet) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{170} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{173} } func (x *ReferralSet) GetId() string { @@ -12728,7 +12917,7 @@ type RunningVolume struct { func (x *RunningVolume) Reset() { *x = RunningVolume{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[171] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[174] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12741,7 +12930,7 @@ func (x *RunningVolume) String() string { func (*RunningVolume) ProtoMessage() {} func (x *RunningVolume) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[171] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[174] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12754,7 +12943,7 @@ func (x *RunningVolume) ProtoReflect() protoreflect.Message { // Deprecated: Use RunningVolume.ProtoReflect.Descriptor instead. func (*RunningVolume) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{171} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{174} } func (x *RunningVolume) GetEpoch() uint64 { @@ -12784,7 +12973,7 @@ type FactorByReferee struct { func (x *FactorByReferee) Reset() { *x = FactorByReferee{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[172] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[175] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12797,7 +12986,7 @@ func (x *FactorByReferee) String() string { func (*FactorByReferee) ProtoMessage() {} func (x *FactorByReferee) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[172] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[175] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12810,7 +12999,7 @@ func (x *FactorByReferee) ProtoReflect() protoreflect.Message { // Deprecated: Use FactorByReferee.ProtoReflect.Descriptor instead. func (*FactorByReferee) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{172} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{175} } func (x *FactorByReferee) GetParty() string { @@ -12846,7 +13035,7 @@ type AssetLocked struct { func (x *AssetLocked) Reset() { *x = AssetLocked{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[173] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[176] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12859,7 +13048,7 @@ func (x *AssetLocked) String() string { func (*AssetLocked) ProtoMessage() {} func (x *AssetLocked) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[173] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[176] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12872,7 +13061,7 @@ func (x *AssetLocked) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetLocked.ProtoReflect.Descriptor instead. func (*AssetLocked) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{173} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{176} } func (x *AssetLocked) GetAsset() string { @@ -12901,7 +13090,7 @@ type EpochBalance struct { func (x *EpochBalance) Reset() { *x = EpochBalance{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[174] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[177] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12914,7 +13103,7 @@ func (x *EpochBalance) String() string { func (*EpochBalance) ProtoMessage() {} func (x *EpochBalance) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[174] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[177] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12927,7 +13116,7 @@ func (x *EpochBalance) ProtoReflect() protoreflect.Message { // Deprecated: Use EpochBalance.ProtoReflect.Descriptor instead. func (*EpochBalance) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{174} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{177} } func (x *EpochBalance) GetEpoch() uint64 { @@ -12956,7 +13145,7 @@ type InVesting struct { func (x *InVesting) Reset() { *x = InVesting{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[175] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[178] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12969,7 +13158,7 @@ func (x *InVesting) String() string { func (*InVesting) ProtoMessage() {} func (x *InVesting) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[175] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[178] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12982,7 +13171,7 @@ func (x *InVesting) ProtoReflect() protoreflect.Message { // Deprecated: Use InVesting.ProtoReflect.Descriptor instead. func (*InVesting) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{175} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{178} } func (x *InVesting) GetAsset() string { @@ -13010,7 +13199,7 @@ type ActivityStreak struct { func (x *ActivityStreak) Reset() { *x = ActivityStreak{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[176] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[179] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13023,7 +13212,7 @@ func (x *ActivityStreak) String() string { func (*ActivityStreak) ProtoMessage() {} func (x *ActivityStreak) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[176] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[179] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13036,7 +13225,7 @@ func (x *ActivityStreak) ProtoReflect() protoreflect.Message { // Deprecated: Use ActivityStreak.ProtoReflect.Descriptor instead. func (*ActivityStreak) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{176} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{179} } func (x *ActivityStreak) GetPartiesActivityStreak() []*PartyActivityStreak { @@ -13061,7 +13250,7 @@ type PartyActivityStreak struct { func (x *PartyActivityStreak) Reset() { *x = PartyActivityStreak{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[177] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[180] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13074,7 +13263,7 @@ func (x *PartyActivityStreak) String() string { func (*PartyActivityStreak) ProtoMessage() {} func (x *PartyActivityStreak) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[177] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[180] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13087,7 +13276,7 @@ func (x *PartyActivityStreak) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyActivityStreak.ProtoReflect.Descriptor instead. func (*PartyActivityStreak) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{177} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{180} } func (x *PartyActivityStreak) GetParty() string { @@ -13144,7 +13333,7 @@ type VolumeDiscountProgram struct { func (x *VolumeDiscountProgram) Reset() { *x = VolumeDiscountProgram{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[178] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[181] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13157,7 +13346,7 @@ func (x *VolumeDiscountProgram) String() string { func (*VolumeDiscountProgram) ProtoMessage() {} func (x *VolumeDiscountProgram) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[178] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[181] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13170,7 +13359,7 @@ func (x *VolumeDiscountProgram) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeDiscountProgram.ProtoReflect.Descriptor instead. func (*VolumeDiscountProgram) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{178} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{181} } func (x *VolumeDiscountProgram) GetParties() []string { @@ -13248,7 +13437,7 @@ type VolumeDiscountStats struct { func (x *VolumeDiscountStats) Reset() { *x = VolumeDiscountStats{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[179] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[182] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13261,7 +13450,7 @@ func (x *VolumeDiscountStats) String() string { func (*VolumeDiscountStats) ProtoMessage() {} func (x *VolumeDiscountStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[179] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[182] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13274,7 +13463,7 @@ func (x *VolumeDiscountStats) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeDiscountStats.ProtoReflect.Descriptor instead. func (*VolumeDiscountStats) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{179} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{182} } func (x *VolumeDiscountStats) GetParty() string { @@ -13302,7 +13491,7 @@ type EpochPartyVolumes struct { func (x *EpochPartyVolumes) Reset() { *x = EpochPartyVolumes{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[180] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[183] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13315,7 +13504,7 @@ func (x *EpochPartyVolumes) String() string { func (*EpochPartyVolumes) ProtoMessage() {} func (x *EpochPartyVolumes) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[180] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[183] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13328,7 +13517,7 @@ func (x *EpochPartyVolumes) ProtoReflect() protoreflect.Message { // Deprecated: Use EpochPartyVolumes.ProtoReflect.Descriptor instead. func (*EpochPartyVolumes) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{180} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{183} } func (x *EpochPartyVolumes) GetPartyVolume() []*PartyVolume { @@ -13350,7 +13539,7 @@ type PartyVolume struct { func (x *PartyVolume) Reset() { *x = PartyVolume{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[181] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[184] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13363,7 +13552,7 @@ func (x *PartyVolume) String() string { func (*PartyVolume) ProtoMessage() {} func (x *PartyVolume) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[181] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[184] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13376,7 +13565,7 @@ func (x *PartyVolume) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyVolume.ProtoReflect.Descriptor instead. func (*PartyVolume) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{181} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{184} } func (x *PartyVolume) GetParty() string { @@ -13407,7 +13596,7 @@ type Liquidation struct { func (x *Liquidation) Reset() { *x = Liquidation{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[182] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[185] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13420,7 +13609,7 @@ func (x *Liquidation) String() string { func (*Liquidation) ProtoMessage() {} func (x *Liquidation) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[182] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[185] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13433,7 +13622,7 @@ func (x *Liquidation) ProtoReflect() protoreflect.Message { // Deprecated: Use Liquidation.ProtoReflect.Descriptor instead. func (*Liquidation) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{182} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{185} } func (x *Liquidation) GetMarketId() string { @@ -13477,7 +13666,7 @@ type PartyAssetAmount struct { func (x *PartyAssetAmount) Reset() { *x = PartyAssetAmount{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[183] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[186] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13490,7 +13679,7 @@ func (x *PartyAssetAmount) String() string { func (*PartyAssetAmount) ProtoMessage() {} func (x *PartyAssetAmount) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[183] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[186] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13503,7 +13692,7 @@ func (x *PartyAssetAmount) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyAssetAmount.ProtoReflect.Descriptor instead. func (*PartyAssetAmount) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{183} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{186} } func (x *PartyAssetAmount) GetParty() string { @@ -13538,7 +13727,7 @@ type BankingTransferFeeDiscounts struct { func (x *BankingTransferFeeDiscounts) Reset() { *x = BankingTransferFeeDiscounts{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[184] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[187] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13551,7 +13740,7 @@ func (x *BankingTransferFeeDiscounts) String() string { func (*BankingTransferFeeDiscounts) ProtoMessage() {} func (x *BankingTransferFeeDiscounts) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[184] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[187] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13564,7 +13753,7 @@ func (x *BankingTransferFeeDiscounts) ProtoReflect() protoreflect.Message { // Deprecated: Use BankingTransferFeeDiscounts.ProtoReflect.Descriptor instead. func (*BankingTransferFeeDiscounts) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{184} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{187} } func (x *BankingTransferFeeDiscounts) GetPartyAssetDiscount() []*PartyAssetAmount { @@ -13590,7 +13779,7 @@ type CompositePriceCalculator struct { func (x *CompositePriceCalculator) Reset() { *x = CompositePriceCalculator{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[185] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[188] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13603,7 +13792,7 @@ func (x *CompositePriceCalculator) String() string { func (*CompositePriceCalculator) ProtoMessage() {} func (x *CompositePriceCalculator) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[185] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[188] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13616,7 +13805,7 @@ func (x *CompositePriceCalculator) ProtoReflect() protoreflect.Message { // Deprecated: Use CompositePriceCalculator.ProtoReflect.Descriptor instead. func (*CompositePriceCalculator) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{185} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{188} } func (x *CompositePriceCalculator) GetCompositePrice() string { @@ -13672,7 +13861,7 @@ type Parties struct { func (x *Parties) Reset() { *x = Parties{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[186] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[189] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13685,7 +13874,7 @@ func (x *Parties) String() string { func (*Parties) ProtoMessage() {} func (x *Parties) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[186] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[189] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13698,7 +13887,7 @@ func (x *Parties) ProtoReflect() protoreflect.Message { // Deprecated: Use Parties.ProtoReflect.Descriptor instead. func (*Parties) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{186} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{189} } func (x *Parties) GetProfiles() []*PartyProfile { @@ -13721,7 +13910,7 @@ type PartyProfile struct { func (x *PartyProfile) Reset() { *x = PartyProfile{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[187] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[190] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13734,7 +13923,7 @@ func (x *PartyProfile) String() string { func (*PartyProfile) ProtoMessage() {} func (x *PartyProfile) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[187] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[190] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13747,7 +13936,7 @@ func (x *PartyProfile) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyProfile.ProtoReflect.Descriptor instead. func (*PartyProfile) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{187} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{190} } func (x *PartyProfile) GetPartyId() string { @@ -13771,18 +13960,91 @@ func (x *PartyProfile) GetMetadata() []*vega.Metadata { return nil } +type AMMValues struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Party string `protobuf:"bytes,1,opt,name=party,proto3" json:"party,omitempty"` + Stake string `protobuf:"bytes,2,opt,name=stake,proto3" json:"stake,omitempty"` + Score string `protobuf:"bytes,3,opt,name=score,proto3" json:"score,omitempty"` + Tick int64 `protobuf:"varint,4,opt,name=tick,proto3" json:"tick,omitempty"` +} + +func (x *AMMValues) Reset() { + *x = AMMValues{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[191] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AMMValues) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AMMValues) ProtoMessage() {} + +func (x *AMMValues) ProtoReflect() protoreflect.Message { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[191] + 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 AMMValues.ProtoReflect.Descriptor instead. +func (*AMMValues) Descriptor() ([]byte, []int) { + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{191} +} + +func (x *AMMValues) GetParty() string { + if x != nil { + return x.Party + } + return "" +} + +func (x *AMMValues) GetStake() string { + if x != nil { + return x.Stake + } + return "" +} + +func (x *AMMValues) GetScore() string { + if x != nil { + return x.Score + } + return "" +} + +func (x *AMMValues) GetTick() int64 { + if x != nil { + return x.Tick + } + return 0 +} + type MarketLiquidity struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PriceRange string `protobuf:"bytes,1,opt,name=price_range,json=priceRange,proto3" json:"price_range,omitempty"` + PriceRange string `protobuf:"bytes,1,opt,name=price_range,json=priceRange,proto3" json:"price_range,omitempty"` + Tick int64 `protobuf:"varint,2,opt,name=tick,proto3" json:"tick,omitempty"` + Amm []*AMMValues `protobuf:"bytes,3,rep,name=amm,proto3" json:"amm,omitempty"` } func (x *MarketLiquidity) Reset() { *x = MarketLiquidity{} if protoimpl.UnsafeEnabled { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[188] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[192] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13795,7 +14057,7 @@ func (x *MarketLiquidity) String() string { func (*MarketLiquidity) ProtoMessage() {} func (x *MarketLiquidity) ProtoReflect() protoreflect.Message { - mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[188] + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[192] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13808,7 +14070,7 @@ func (x *MarketLiquidity) ProtoReflect() protoreflect.Message { // Deprecated: Use MarketLiquidity.ProtoReflect.Descriptor instead. func (*MarketLiquidity) Descriptor() ([]byte, []int) { - return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{188} + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{192} } func (x *MarketLiquidity) GetPriceRange() string { @@ -13818,6 +14080,210 @@ func (x *MarketLiquidity) GetPriceRange() string { return "" } +func (x *MarketLiquidity) GetTick() int64 { + if x != nil { + return x.Tick + } + return 0 +} + +func (x *MarketLiquidity) GetAmm() []*AMMValues { + if x != nil { + return x.Amm + } + return nil +} + +type PoolMapEntry_Curve struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + L string `protobuf:"bytes,1,opt,name=l,proto3" json:"l,omitempty"` + High string `protobuf:"bytes,2,opt,name=high,proto3" json:"high,omitempty"` + Low string `protobuf:"bytes,3,opt,name=low,proto3" json:"low,omitempty"` + Rf string `protobuf:"bytes,4,opt,name=rf,proto3" json:"rf,omitempty"` + Empty bool `protobuf:"varint,5,opt,name=empty,proto3" json:"empty,omitempty"` +} + +func (x *PoolMapEntry_Curve) Reset() { + *x = PoolMapEntry_Curve{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[193] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PoolMapEntry_Curve) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PoolMapEntry_Curve) ProtoMessage() {} + +func (x *PoolMapEntry_Curve) ProtoReflect() protoreflect.Message { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[193] + 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 PoolMapEntry_Curve.ProtoReflect.Descriptor instead. +func (*PoolMapEntry_Curve) Descriptor() ([]byte, []int) { + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{70, 0} +} + +func (x *PoolMapEntry_Curve) GetL() string { + if x != nil { + return x.L + } + return "" +} + +func (x *PoolMapEntry_Curve) GetHigh() string { + if x != nil { + return x.High + } + return "" +} + +func (x *PoolMapEntry_Curve) GetLow() string { + if x != nil { + return x.Low + } + return "" +} + +func (x *PoolMapEntry_Curve) GetRf() string { + if x != nil { + return x.Rf + } + return "" +} + +func (x *PoolMapEntry_Curve) GetEmpty() bool { + if x != nil { + return x.Empty + } + return false +} + +type PoolMapEntry_Pool struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + SubAccount string `protobuf:"bytes,2,opt,name=sub_account,json=subAccount,proto3" json:"sub_account,omitempty"` + Commitment string `protobuf:"bytes,3,opt,name=commitment,proto3" json:"commitment,omitempty"` + Parameters *v12.AMMPool_ConcentratedLiquidityParameters `protobuf:"bytes,4,opt,name=parameters,proto3" json:"parameters,omitempty"` + Asset string `protobuf:"bytes,5,opt,name=asset,proto3" json:"asset,omitempty"` + Market string `protobuf:"bytes,6,opt,name=market,proto3" json:"market,omitempty"` + Lower *PoolMapEntry_Curve `protobuf:"bytes,7,opt,name=lower,proto3" json:"lower,omitempty"` + Upper *PoolMapEntry_Curve `protobuf:"bytes,8,opt,name=upper,proto3" json:"upper,omitempty"` + Status v12.AMMPool_Status `protobuf:"varint,9,opt,name=status,proto3,enum=vega.events.v1.AMMPool_Status" json:"status,omitempty"` +} + +func (x *PoolMapEntry_Pool) Reset() { + *x = PoolMapEntry_Pool{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[194] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PoolMapEntry_Pool) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PoolMapEntry_Pool) ProtoMessage() {} + +func (x *PoolMapEntry_Pool) ProtoReflect() protoreflect.Message { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[194] + 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 PoolMapEntry_Pool.ProtoReflect.Descriptor instead. +func (*PoolMapEntry_Pool) Descriptor() ([]byte, []int) { + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{70, 1} +} + +func (x *PoolMapEntry_Pool) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *PoolMapEntry_Pool) GetSubAccount() string { + if x != nil { + return x.SubAccount + } + return "" +} + +func (x *PoolMapEntry_Pool) GetCommitment() string { + if x != nil { + return x.Commitment + } + return "" +} + +func (x *PoolMapEntry_Pool) GetParameters() *v12.AMMPool_ConcentratedLiquidityParameters { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *PoolMapEntry_Pool) GetAsset() string { + if x != nil { + return x.Asset + } + return "" +} + +func (x *PoolMapEntry_Pool) GetMarket() string { + if x != nil { + return x.Market + } + return "" +} + +func (x *PoolMapEntry_Pool) GetLower() *PoolMapEntry_Curve { + if x != nil { + return x.Lower + } + return nil +} + +func (x *PoolMapEntry_Pool) GetUpper() *PoolMapEntry_Curve { + if x != nil { + return x.Upper + } + return nil +} + +func (x *PoolMapEntry_Pool) GetStatus() v12.AMMPool_Status { + if x != nil { + return x.Status + } + return v12.AMMPool_Status(0) +} + var File_vega_snapshot_v1_snapshot_proto protoreflect.FileDescriptor var file_vega_snapshot_v1_snapshot_proto_rawDesc = []byte{ @@ -14882,7 +15348,7 @@ var file_vega_snapshot_v1_snapshot_proto_rawDesc = []byte{ 0x74, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, 0x0f, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x22, 0xbc, 0x0e, 0x0a, + 0x6b, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x22, 0xea, 0x0e, 0x0a, 0x06, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x24, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x43, 0x0a, @@ -14996,1408 +15462,1477 @@ var file_vega_snapshot_v1_snapshot_proto_rawDesc = []byte{ 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, 0x0f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x42, 0x26, 0x0a, 0x24, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x5f, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x4e, 0x0a, 0x11, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, - 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, - 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x42, 0x0a, 0x07, 0x50, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x70, 0x65, 0x72, 0x70, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x70, 0x73, 0x48, 0x00, - 0x52, 0x05, 0x70, 0x65, 0x72, 0x70, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, - 0x3f, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, - 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x22, 0x5b, 0x0a, 0x10, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x73, 0x12, 0x0c, 0x0a, 0x01, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, - 0x01, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x61, 0x75, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x53, 0x0a, - 0x08, 0x54, 0x57, 0x41, 0x50, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, - 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x75, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x6d, 0x50, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x22, 0xc7, 0x03, 0x0a, 0x05, 0x50, 0x65, 0x72, 0x70, 0x73, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x4b, 0x0a, 0x13, - 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x13, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x52, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, - 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x48, 0x0a, 0x12, 0x65, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x77, 0x61, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x57, 0x41, 0x50, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x77, 0x61, 0x70, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x48, 0x0a, 0x12, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x77, - 0x61, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x69, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x03, 0x61, 0x6d, 0x6d, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6d, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x03, 0x61, 0x6d, + 0x6d, 0x42, 0x26, 0x0a, 0x24, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, + 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x4e, 0x0a, 0x11, 0x50, 0x61, 0x72, + 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x14, + 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xbf, 0x01, 0x0a, 0x08, 0x41, 0x6d, + 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x73, 0x71, 0x72, 0x74, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x73, 0x71, 0x72, 0x74, 0x65, 0x72, + 0x12, 0x43, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x75, 0x62, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x70, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x22, 0xd1, 0x04, 0x0a, 0x0c, + 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x12, 0x37, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x1a, 0x61, 0x0a, 0x05, 0x43, + 0x75, 0x72, 0x76, 0x65, 0x12, 0x0c, 0x0a, 0x01, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x01, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x69, 0x67, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x68, 0x69, 0x67, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x77, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6c, 0x6f, 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x72, 0x66, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x72, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x70, 0x74, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x8e, + 0x03, 0x0a, 0x04, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x75, 0x62, 0x5f, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, + 0x62, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4d, + 0x4d, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, + 0x3a, 0x0a, 0x05, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, + 0x75, 0x72, 0x76, 0x65, 0x52, 0x05, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x05, 0x75, + 0x70, 0x70, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, + 0x6f, 0x6c, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x43, 0x75, 0x72, 0x76, 0x65, + 0x52, 0x05, 0x75, 0x70, 0x70, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4d, 0x4d, 0x50, 0x6f, 0x6f, 0x6c, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, + 0x38, 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x42, 0x0a, 0x07, 0x50, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x70, 0x65, 0x72, 0x70, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x70, 0x73, 0x48, 0x00, 0x52, 0x05, + 0x70, 0x65, 0x72, 0x70, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3f, 0x0a, + 0x09, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x5b, + 0x0a, 0x10, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x73, 0x12, 0x0c, 0x0a, 0x01, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x01, 0x74, + 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x53, 0x0a, 0x08, 0x54, + 0x57, 0x41, 0x50, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, + 0x1f, 0x0a, 0x0b, 0x73, 0x75, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x6d, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x22, 0xc7, 0x03, 0x0a, 0x05, 0x50, 0x65, 0x72, 0x70, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x4b, 0x0a, 0x13, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x61, + 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, + 0x74, 0x52, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x48, 0x0a, 0x12, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x74, 0x77, 0x61, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x57, 0x41, 0x50, 0x44, 0x61, 0x74, 0x61, 0x52, 0x10, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x77, 0x61, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x48, 0x0a, 0x12, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x77, 0x61, 0x70, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x57, 0x41, 0x50, 0x44, 0x61, 0x74, 0x61, 0x52, 0x10, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x54, 0x77, 0x61, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4f, 0x0a, 0x11, 0x61, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x52, 0x10, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x22, 0x3d, 0x0a, 0x0d, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x73, 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0x98, 0x01, 0x0a, 0x10, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x42, + 0x0a, 0x0c, 0x66, 0x61, 0x6c, 0x6c, 0x73, 0x5f, 0x62, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x41, 0x74, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x0b, 0x66, 0x61, 0x6c, 0x6c, 0x73, 0x42, 0x65, 0x6c, 0x6c, + 0x6f, 0x77, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x69, 0x73, 0x65, 0x73, 0x5f, 0x61, 0x62, 0x6f, 0x76, + 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x0a, 0x72, 0x69, 0x73, 0x65, 0x73, 0x41, + 0x62, 0x6f, 0x76, 0x65, 0x22, 0xc4, 0x01, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x12, 0x43, 0x0a, 0x0c, 0x66, 0x61, 0x6c, 0x6c, 0x73, 0x5f, 0x62, 0x65, 0x6c, + 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x73, 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x0b, 0x66, 0x61, 0x6c, + 0x6c, 0x73, 0x42, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x41, 0x0a, 0x0b, 0x72, 0x69, 0x73, 0x65, + 0x73, 0x5f, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x57, 0x41, 0x50, 0x44, 0x61, 0x74, 0x61, 0x52, 0x10, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x54, 0x77, 0x61, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4f, 0x0a, 0x11, 0x61, - 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x52, 0x10, 0x61, 0x75, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x22, 0x3d, 0x0a, 0x0d, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0x98, 0x01, 0x0a, 0x10, - 0x50, 0x72, 0x69, 0x63, 0x65, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, - 0x12, 0x42, 0x0a, 0x0c, 0x66, 0x61, 0x6c, 0x6c, 0x73, 0x5f, 0x62, 0x65, 0x6c, 0x6c, 0x6f, 0x77, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, + 0x2e, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, + 0x0a, 0x72, 0x69, 0x73, 0x65, 0x73, 0x41, 0x62, 0x6f, 0x76, 0x65, 0x22, 0x40, 0x0a, 0x0e, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x73, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0x62, 0x0a, + 0x0e, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, - 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x0b, 0x66, 0x61, 0x6c, 0x6c, 0x73, 0x42, 0x65, - 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x69, 0x73, 0x65, 0x73, 0x5f, 0x61, 0x62, - 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x73, 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x0a, 0x72, 0x69, 0x73, 0x65, - 0x73, 0x41, 0x62, 0x6f, 0x76, 0x65, 0x22, 0xc4, 0x01, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x69, 0x6c, - 0x69, 0x6e, 0x67, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, - 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, - 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x43, 0x0a, 0x0c, 0x66, 0x61, 0x6c, 0x6c, 0x73, 0x5f, 0x62, - 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x0b, 0x66, - 0x61, 0x6c, 0x6c, 0x73, 0x42, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x41, 0x0a, 0x0b, 0x72, 0x69, - 0x73, 0x65, 0x73, 0x5f, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, - 0x65, 0x52, 0x0a, 0x72, 0x69, 0x73, 0x65, 0x73, 0x41, 0x62, 0x6f, 0x76, 0x65, 0x22, 0x40, 0x0a, - 0x0e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, - 0x62, 0x0a, 0x0e, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x41, 0x74, 0x50, 0x72, 0x69, 0x63, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x73, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x73, 0x22, 0xf7, 0x01, 0x0a, 0x0a, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x73, 0x12, 0x50, 0x0a, 0x12, 0x70, 0x72, 0x69, 0x63, 0x65, 0x64, 0x5f, 0x73, 0x74, - 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x73, 0x52, 0x10, 0x70, 0x72, 0x69, 0x63, 0x65, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x56, 0x0a, 0x14, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, - 0x67, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x53, - 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x12, 0x74, 0x72, 0x61, 0x69, 0x6c, - 0x69, 0x6e, 0x67, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0x40, 0x0a, - 0x0c, 0x50, 0x65, 0x67, 0x67, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x30, 0x0a, - 0x0d, 0x70, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, - 0xad, 0x03, 0x0a, 0x10, 0x53, 0x4c, 0x41, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x70, 0x65, 0x6e, - 0x61, 0x6c, 0x74, 0x79, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x62, 0x6f, 0x6e, 0x64, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x46, 0x61, - 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x5f, 0x65, 0x78, - 0x69, 0x74, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x45, 0x78, 0x69, 0x74, 0x50, 0x65, 0x6e, 0x61, 0x6c, - 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, - 0x61, 0x78, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x12, 0x46, - 0x0a, 0x20, 0x6e, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x5f, 0x6d, - 0x61, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, 0x6e, 0x6f, 0x6e, 0x50, 0x65, 0x72, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x6f, 0x6e, 0x64, 0x50, 0x65, 0x6e, 0x61, - 0x6c, 0x74, 0x79, 0x4d, 0x61, 0x78, 0x12, 0x4a, 0x0a, 0x22, 0x6e, 0x6f, 0x6e, 0x5f, 0x70, 0x65, - 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x70, - 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x5f, 0x73, 0x6c, 0x6f, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x1e, 0x6e, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, - 0x63, 0x65, 0x42, 0x6f, 0x6e, 0x64, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x53, 0x6c, 0x6f, - 0x70, 0x65, 0x12, 0x2d, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x63, - 0x63, 0x79, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x43, 0x63, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x12, 0x4c, 0x0a, 0x23, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x66, - 0x65, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1f, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x46, 0x65, 0x65, 0x43, 0x61, 0x6c, 0x63, - 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x65, 0x70, 0x22, - 0x80, 0x03, 0x0a, 0x10, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, - 0x07, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x73, 0x70, 0x6f, 0x74, - 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x0b, 0x73, 0x70, - 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x0f, 0x73, 0x65, 0x74, - 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x0e, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x0a, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x6f, 0x72, 0x73, 0x52, 0x0a, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, - 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x73, - 0x12, 0x50, 0x0a, 0x12, 0x73, 0x6c, 0x61, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, + 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x73, 0x22, 0xf7, 0x01, 0x0a, 0x0a, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x3f, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x50, 0x0a, 0x12, 0x70, 0x72, 0x69, 0x63, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x6f, 0x70, + 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x52, 0x10, 0x70, 0x72, 0x69, 0x63, 0x65, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x73, 0x12, 0x56, 0x0a, 0x14, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, + 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x6f, + 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x12, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0x40, 0x0a, 0x0c, 0x50, + 0x65, 0x67, 0x67, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x0d, 0x70, + 0x61, 0x72, 0x6b, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, + 0x0c, 0x70, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0xad, 0x03, + 0x0a, 0x10, 0x53, 0x4c, 0x41, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, + 0x74, 0x79, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x62, 0x6f, 0x6e, 0x64, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x46, 0x61, 0x63, 0x74, + 0x6f, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x74, + 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x65, 0x61, 0x72, 0x6c, 0x79, 0x45, 0x78, 0x69, 0x74, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, + 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x61, 0x78, + 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x12, 0x46, 0x0a, 0x20, + 0x6e, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x5f, 0x6d, 0x61, 0x78, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, 0x6e, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x6f, 0x6e, 0x64, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, + 0x79, 0x4d, 0x61, 0x78, 0x12, 0x4a, 0x0a, 0x22, 0x6e, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x70, 0x65, 0x6e, + 0x61, 0x6c, 0x74, 0x79, 0x5f, 0x73, 0x6c, 0x6f, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x1e, 0x6e, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, + 0x42, 0x6f, 0x6e, 0x64, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x53, 0x6c, 0x6f, 0x70, 0x65, + 0x12, 0x2d, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x63, 0x79, + 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, + 0x74, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x43, 0x63, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, + 0x4c, 0x0a, 0x23, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x66, 0x65, 0x65, + 0x5f, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1f, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x46, 0x65, 0x65, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x65, 0x70, 0x22, 0x80, 0x03, + 0x0a, 0x10, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x4c, 0x41, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x52, 0x10, 0x73, 0x6c, 0x61, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x22, 0x5e, 0x0a, 0x0a, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, - 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x10, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x73, 0x22, 0x97, 0x02, 0x0a, 0x08, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x10, - 0x0a, 0x03, 0x62, 0x75, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x62, 0x75, 0x79, - 0x12, 0x12, 0x0a, 0x04, 0x73, 0x65, 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, - 0x73, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x62, 0x75, - 0x79, 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x62, 0x75, 0x79, 0x53, 0x75, 0x6d, 0x50, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x65, 0x6c, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, - 0x6c, 0x6c, 0x53, 0x75, 0x6d, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, - 0x64, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x64, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, - 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x61, 0x76, 0x65, 0x72, 0x61, - 0x67, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0xb7, 0x01, 0x0a, - 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x38, 0x0a, - 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x22, 0x86, 0x02, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x79, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x14, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, - 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x48, 0x00, 0x52, 0x12, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x6c, 0x6f, - 0x77, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, - 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x12, 0x6c, 0x6f, 0x77, 0x65, - 0x73, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x88, 0x01, - 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x5f, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x64, - 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x65, 0x73, 0x74, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x73, 0x74, 0x5f, - 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x10, 0x0a, - 0x0e, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, - 0xee, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, - 0x12, 0x26, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x4d, - 0x61, 0x72, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x73, 0x74, - 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x14, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x64, 0x65, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x06, 0x74, 0x72, 0x61, 0x64, 0x65, 0x73, - 0x22, 0x56, 0x0a, 0x13, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x29, 0x0a, - 0x10, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x94, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x74, - 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, - 0x73, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x22, - 0xbd, 0x01, 0x0a, 0x08, 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x19, - 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, - 0xc3, 0x01, 0x0a, 0x0a, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x10, - 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x12, 0x36, 0x0a, 0x18, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x14, 0x72, 0x65, 0x61, 0x64, 0x79, 0x54, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x4e, 0x65, 0x77, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x2b, 0x0a, 0x12, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x54, 0x6f, 0x45, 0x6e, 0x64, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x7b, 0x0a, 0x15, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, - 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x73, 0x12, 0x62, - 0x0a, 0x18, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x73, 0x5f, 0x70, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x73, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x52, 0x16, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x61, 0x79, 0x6f, - 0x75, 0x74, 0x22, 0x81, 0x01, 0x0a, 0x16, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, - 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x70, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x46, - 0x0a, 0x0e, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x70, 0x61, 0x79, 0x6f, 0x75, 0x74, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x73, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x52, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, - 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x22, 0xfc, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x73, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6d, - 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x12, 0x54, 0x0a, 0x13, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, + 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x0b, 0x73, 0x70, 0x6f, 0x74, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x0f, 0x73, 0x65, 0x74, 0x74, 0x6c, + 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x0e, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x73, 0x12, 0x3c, 0x0a, 0x0a, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x73, 0x52, 0x0a, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, + 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x50, + 0x0a, 0x12, 0x73, 0x6c, 0x61, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x4c, + 0x41, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x10, + 0x73, 0x6c, 0x61, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x22, 0x5e, 0x0a, 0x0a, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x23, + 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, + 0x22, 0x97, 0x02, 0x0a, 0x08, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, + 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x62, 0x75, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x62, 0x75, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x65, 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x65, + 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x62, 0x75, 0x79, 0x5f, + 0x73, 0x75, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x62, 0x75, 0x79, 0x53, 0x75, 0x6d, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x12, 0x28, 0x0a, 0x10, 0x73, 0x65, 0x6c, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x5f, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x6c, 0x6c, + 0x53, 0x75, 0x6d, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, + 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, + 0x64, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x76, + 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x0f, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, + 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x11, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x50, 0x61, 0x72, 0x74, - 0x79, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x42, 0x0a, 0x12, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x63, + 0x6f, 0x72, 0x64, 0x73, 0x22, 0x86, 0x02, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x94, 0x04, 0x0a, 0x0a, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x61, 0x6e, - 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x61, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x61, 0x6e, 0x5f, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0f, 0x63, 0x61, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x6c, - 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x67, 0x65, 0x6e, - 0x65, 0x73, 0x69, 0x73, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x13, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x1b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x5f, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x66, - 0x72, 0x6f, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x70, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x46, - 0x72, 0x6f, 0x6d, 0x12, 0x3b, 0x0a, 0x1a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x6f, - 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, - 0x12, 0x3d, 0x0a, 0x1b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x73, 0x70, 0x6f, 0x74, - 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x53, 0x70, - 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x3f, 0x0a, 0x1c, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x70, 0x73, - 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x65, - 0x72, 0x70, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x22, 0x94, 0x04, 0x0a, 0x0e, 0x56, 0x6f, 0x74, 0x65, 0x53, 0x70, 0x61, 0x6d, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x12, 0x4c, 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x6f, 0x5f, - 0x76, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, - 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x56, 0x6f, 0x74, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x54, 0x6f, 0x56, 0x6f, 0x74, - 0x65, 0x12, 0x44, 0x0a, 0x0e, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6e, - 0x6e, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x0d, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x0d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, + 0x79, 0x12, 0x35, 0x0a, 0x14, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, + 0x00, 0x52, 0x12, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x6c, 0x6f, 0x77, 0x65, + 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x12, 0x6c, 0x6f, 0x77, 0x65, 0x73, 0x74, + 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x28, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, + 0x73, 0x74, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, + 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0xee, 0x01, + 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x26, + 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x61, 0x72, + 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, + 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, + 0x74, 0x74, 0x6c, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x6c, + 0x61, 0x73, 0x74, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x64, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x06, 0x74, 0x72, 0x61, 0x64, 0x65, 0x73, 0x22, 0x56, + 0x0a, 0x13, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x73, + 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x94, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x74, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xbd, 0x01, + 0x0a, 0x08, 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x75, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, 0xc3, 0x01, + 0x0a, 0x0a, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x73, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x36, + 0x0a, 0x18, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x14, 0x72, 0x65, 0x61, 0x64, 0x79, 0x54, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4e, 0x65, + 0x77, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x2b, 0x0a, 0x12, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, + 0x74, 0x6f, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x54, 0x6f, 0x45, 0x6e, 0x64, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x22, 0x7b, 0x0a, 0x15, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x73, 0x12, 0x62, 0x0a, 0x18, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x73, 0x5f, 0x70, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x12, 0x5f, 0x0a, 0x1a, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, - 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x17, 0x72, 0x65, 0x63, 0x65, 0x6e, - 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, - 0x61, 0x73, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x11, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, 0x37, - 0x0a, 0x18, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x73, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x60, 0x0a, 0x16, 0x50, 0x61, 0x72, 0x74, 0x79, + 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x73, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x52, 0x16, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x64, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, + 0x22, 0x81, 0x01, 0x0a, 0x16, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x70, + 0x61, 0x79, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0a, 0x70, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x0e, + 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x70, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, + 0x61, 0x79, 0x6f, 0x75, 0x74, 0x52, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x61, + 0x79, 0x6f, 0x75, 0x74, 0x22, 0xfc, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, + 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, + 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, + 0x54, 0x0a, 0x13, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x11, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x22, 0x42, 0x0a, 0x12, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc3, 0x04, 0x0a, 0x0a, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x61, 0x6e, 0x5f, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x61, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x61, 0x6e, 0x5f, 0x70, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0f, 0x63, 0x61, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, + 0x69, 0x73, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x32, + 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x1b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x6f, + 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x46, 0x72, 0x6f, + 0x6d, 0x12, 0x3b, 0x0a, 0x1a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x3d, + 0x0a, 0x1b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x18, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x53, 0x70, 0x6f, 0x74, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3f, 0x0a, + 0x1c, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x70, 0x73, 0x5f, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x19, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x65, 0x72, 0x70, + 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2d, + 0x0a, 0x13, 0x63, 0x61, 0x6e, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x61, 0x6d, 0x6d, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x61, 0x6e, + 0x55, 0x73, 0x65, 0x41, 0x6d, 0x6d, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x94, 0x04, + 0x0a, 0x0e, 0x56, 0x6f, 0x74, 0x65, 0x53, 0x70, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x4c, 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x6f, 0x5f, 0x76, 0x6f, 0x74, + 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x56, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x43, 0x0a, 0x11, 0x50, 0x61, 0x72, - 0x74, 0x79, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x14, + 0x74, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x54, 0x6f, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x44, + 0x0a, 0x0e, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x64, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x0d, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x0d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x62, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x52, 0x0c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x5f, + 0x0a, 0x1a, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, + 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x6a, 0x65, 0x63, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x17, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, + 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x2e, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x6c, 0x61, + 0x73, 0x74, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, + 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x5f, 0x73, 0x65, 0x71, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, 0x37, 0x0a, 0x18, 0x6d, + 0x69, 0x6e, 0x5f, 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, + 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6d, + 0x69, 0x6e, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x46, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x22, 0x60, 0x0a, 0x16, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x56, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x44, - 0x0a, 0x10, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x47, 0x0a, 0x19, 0x53, 0x70, 0x61, 0x6d, 0x50, 0x61, 0x72, 0x74, - 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc2, 0x02, - 0x0a, 0x10, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x70, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x6f, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x70, 0x61, 0x6d, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, 0x54, - 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x0e, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, - 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x0d, 0x62, - 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x0d, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, - 0x65, 0x71, 0x22, 0x70, 0x0a, 0x0a, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x53, 0x69, 0x67, 0x73, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x69, 0x67, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x65, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x22, 0x47, 0x0a, 0x06, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x12, 0x3d, - 0x0a, 0x0b, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x53, 0x69, 0x67, - 0x73, 0x52, 0x0a, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x53, 0x69, 0x67, 0x73, 0x22, 0x6d, 0x0a, - 0x16, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x44, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x10, 0x70, 0x65, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, 0x22, 0x67, 0x0a, 0x14, - 0x53, 0x74, 0x61, 0x6b, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x64, 0x12, 0x4f, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x50, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0e, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x22, 0x85, 0x02, 0x0a, 0x14, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x29, - 0x0a, 0x10, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x76, 0x65, 0x67, - 0x61, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x76, 0x65, 0x67, 0x61, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, - 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x6c, - 0x6f, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, - 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x78, 0x5f, 0x69, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x64, 0x0a, - 0x0c, 0x4c, 0x32, 0x45, 0x74, 0x68, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x54, 0x0a, - 0x14, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x5f, 0x65, 0x74, 0x68, 0x5f, 0x6f, 0x72, - 0x61, 0x63, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x61, 0x72, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x43, 0x0a, 0x11, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, + 0x79, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x44, 0x0a, 0x10, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x08, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x22, 0x47, 0x0a, 0x19, 0x53, 0x70, 0x61, 0x6d, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc2, 0x02, 0x0a, 0x10, 0x53, + 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x70, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x6d, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, 0x54, 0x6f, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x0e, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x42, + 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x0d, 0x62, 0x61, 0x6e, 0x6e, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x0d, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x22, + 0x70, 0x0a, 0x0a, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x53, 0x69, 0x67, 0x73, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x73, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x22, 0x47, 0x0a, 0x06, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x12, 0x3d, 0x0a, 0x0b, 0x6e, + 0x6f, 0x74, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x53, 0x69, 0x67, 0x73, 0x52, 0x0a, + 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x79, 0x53, 0x69, 0x67, 0x73, 0x22, 0x6d, 0x0a, 0x16, 0x53, 0x74, + 0x61, 0x6b, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x10, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, 0x22, 0x67, 0x0a, 0x14, 0x53, 0x74, 0x61, + 0x6b, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x64, 0x12, 0x4f, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, + 0x61, 0x6b, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x50, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x52, 0x0e, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x64, 0x22, 0x85, 0x02, 0x0a, 0x14, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x29, 0x0a, 0x10, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x76, 0x65, 0x67, 0x61, 0x5f, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x76, 0x65, 0x67, 0x61, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x16, + 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x67, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x64, 0x0a, 0x0c, 0x4c, 0x32, + 0x45, 0x74, 0x68, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x54, 0x0a, 0x14, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x5f, 0x65, 0x74, 0x68, 0x5f, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, + 0x6e, 0x49, 0x64, 0x45, 0x74, 0x68, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x11, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x45, 0x74, 0x68, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, - 0x52, 0x11, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x45, 0x74, 0x68, 0x4f, 0x72, 0x61, 0x63, - 0x6c, 0x65, 0x73, 0x22, 0x92, 0x02, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x45, - 0x74, 0x68, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, - 0x64, 0x12, 0x4b, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x4f, 0x72, 0x61, 0x63, - 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x4c, 0x61, 0x73, 0x74, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x4b, - 0x0a, 0x0c, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x61, 0x63, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x0b, - 0x63, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x04, 0x6d, - 0x69, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, - 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x4d, 0x69, - 0x73, 0x63, 0x52, 0x04, 0x6d, 0x69, 0x73, 0x63, 0x22, 0x5e, 0x0a, 0x1a, 0x45, 0x74, 0x68, 0x4f, - 0x72, 0x61, 0x63, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x4c, 0x61, 0x73, - 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xa5, 0x01, 0x0a, 0x15, 0x45, 0x74, 0x68, - 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x4d, 0x69, - 0x73, 0x63, 0x12, 0x3d, 0x0a, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x73, 0x12, 0x4d, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x4f, 0x72, 0x61, - 0x63, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x4c, 0x61, 0x73, 0x74, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x0a, 0x70, 0x61, 0x74, 0x63, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x22, 0x82, 0x01, 0x0a, 0x16, 0x45, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, - 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x68, 0x0a, 0x1c, 0x70, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, - 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x22, 0x92, 0x02, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x45, 0x74, 0x68, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x4b, + 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x4c, 0x61, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x4b, 0x0a, 0x0c, 0x63, + 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, - 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x19, 0x70, 0x65, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xdc, 0x01, 0x0a, 0x15, 0x45, 0x74, 0x68, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x70, 0x65, 0x63, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, - 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x48, - 0x01, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, - 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x3b, 0x0a, 0x11, 0x45, 0x74, 0x68, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, - 0x73, 0x22, 0x9b, 0x01, 0x0a, 0x12, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, - 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, - 0x64, 0x65, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x75, 0x62, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x77, 0x50, 0x75, - 0x62, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x11, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x75, 0x62, 0x5f, - 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0e, 0x6e, 0x65, 0x77, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, - 0xb8, 0x01, 0x0a, 0x1a, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, - 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, - 0x77, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x6e, 0x65, 0x77, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x6f, 0x6c, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xdd, 0x04, 0x0a, 0x08, 0x54, - 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x47, 0x0a, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, - 0x5f, 0x0a, 0x19, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, - 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, - 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x5b, 0x0a, 0x15, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x65, - 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x65, 0x72, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x71, 0x0a, - 0x1e, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x1b, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x43, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6c, 0x6f, 0x67, 0x79, 0x53, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x73, 0x0a, 0x1f, 0x75, 0x6e, 0x73, 0x6f, 0x6c, 0x76, 0x65, - 0x64, 0x5f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, + 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x0b, 0x63, 0x61, 0x6c, + 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x04, 0x6d, 0x69, 0x73, 0x63, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x4d, 0x69, 0x73, 0x63, 0x52, + 0x04, 0x6d, 0x69, 0x73, 0x63, 0x22, 0x5e, 0x0a, 0x1a, 0x45, 0x74, 0x68, 0x4f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x4c, 0x61, 0x73, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xa5, 0x01, 0x0a, 0x15, 0x45, 0x74, 0x68, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x4d, 0x69, 0x73, 0x63, 0x12, + 0x3d, 0x0a, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x4d, + 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x4c, 0x61, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x52, 0x0a, 0x70, 0x61, 0x74, 0x63, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x82, 0x01, + 0x0a, 0x16, 0x45, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x61, 0x6c, + 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x68, 0x0a, 0x1c, 0x70, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x63, 0x61, 0x6c, + 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1c, 0x75, 0x6e, - 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, - 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xde, 0x01, 0x0a, 0x11, 0x54, - 0x6f, 0x70, 0x6c, 0x6f, 0x67, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x12, 0x65, 0x0a, 0x12, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x61, 0x6c, + 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x19, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x22, 0xdc, 0x01, 0x0a, 0x15, 0x45, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x21, 0x0a, 0x0c, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x17, + 0x0a, 0x07, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x70, 0x65, 0x63, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, + 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x07, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, + 0x64, 0x22, 0x3b, 0x0a, 0x11, 0x45, 0x74, 0x68, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x02, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x9b, + 0x01, 0x0a, 0x12, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, + 0x64, 0x12, 0x1e, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x77, 0x50, 0x75, 0x62, 0x4b, 0x65, + 0x79, 0x12, 0x29, 0x0a, 0x11, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x6e, 0x65, + 0x77, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0xb8, 0x01, 0x0a, + 0x1a, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, + 0x77, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x75, 0x62, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x6c, 0x64, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xdd, 0x04, 0x0a, 0x08, 0x54, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x47, 0x0a, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0d, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x5f, 0x0a, 0x19, + 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x5f, + 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5b, 0x0a, + 0x15, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x73, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x52, 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x62, 0x0a, 0x11, 0x69, 0x73, 0x73, 0x75, 0x65, - 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, 0x45, 0x52, 0x43, 0x32, - 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x10, 0x69, 0x73, 0x73, 0x75, 0x65, - 0x64, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0xb3, 0x01, 0x0a, 0x24, - 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x73, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x29, 0x0a, - 0x10, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x61, - 0x64, 0x64, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x64, 0x64, 0x65, - 0x64, 0x22, 0xb9, 0x01, 0x0a, 0x23, 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, 0x45, 0x52, 0x43, 0x32, - 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x74, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x6e, 0x63, 0x65, 0x52, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, + 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x71, 0x0a, 0x1e, 0x70, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x6b, + 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x1b, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x43, 0x0a, + 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6c, 0x6f, 0x67, 0x79, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x12, 0x73, 0x0a, 0x1f, 0x75, 0x6e, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x5f, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, + 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1c, 0x75, 0x6e, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x64, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xde, 0x01, 0x0a, 0x11, 0x54, 0x6f, 0x70, 0x6c, + 0x6f, 0x67, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x65, 0x0a, + 0x12, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, + 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x52, 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x12, 0x62, 0x0a, 0x11, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x5f, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x35, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x10, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0xb3, 0x01, 0x0a, 0x24, 0x50, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, + 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0xf2, 0x03, - 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x4a, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x0f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x11, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x46, 0x0a, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, - 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x1c, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x57, 0x69, 0x74, 0x68, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x52, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, - 0x14, 0x65, 0x74, 0x68, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x77, - 0x61, 0x72, 0x64, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x65, 0x74, 0x68, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x12, - 0x4f, 0x0a, 0x11, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x5f, 0x74, 0x72, 0x61, - 0x63, 0x6b, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, - 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x52, 0x10, - 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, - 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x6f, - 0x77, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x6f, 0x72, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0d, 0x72, 0x61, 0x6e, - 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x53, - 0x63, 0x6f, 0x72, 0x65, 0x52, 0x0c, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x6f, - 0x72, 0x65, 0x22, 0xb9, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, - 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x65, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x65, 0x78, - 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x37, 0x0a, 0x18, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x73, 0x69, 0x6e, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x61, 0x73, 0x68, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x69, 0x67, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x08, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x69, 0x67, 0x73, 0x22, 0x99, - 0x02, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x6f, 0x74, 0x65, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x6f, 0x74, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x76, 0x6f, 0x74, 0x65, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x56, 0x6f, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x6c, 0x0a, 0x14, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, - 0x63, 0x65, 0x12, 0x54, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, - 0x70, 0x65, 0x72, 0x66, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x52, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, - 0x65, 0x72, 0x66, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0xae, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x71, - 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x12, 0x17, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x46, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x61, 0x78, - 0x5f, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x53, 0x68, 0x61, 0x70, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x3b, 0x0a, 0x1a, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x17, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x4f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1b, 0x0a, 0x09, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0x68, 0x0a, 0x1a, 0x4c, 0x69, 0x71, - 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x65, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x64, 0x64, 0x65, 0x64, 0x22, 0xb9, + 0x01, 0x0a, 0x23, 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0xf2, 0x03, 0x0a, 0x0e, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4a, 0x0a, + 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x11, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x12, 0x46, 0x0a, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x72, + 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1c, 0x6c, 0x61, + 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x57, 0x69, 0x74, 0x68, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x52, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x65, 0x74, + 0x68, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, + 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x65, 0x74, 0x68, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x12, 0x4f, 0x0a, 0x11, + 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x65, + 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, + 0x62, 0x65, 0x61, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x52, 0x10, 0x68, 0x65, 0x61, + 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x12, 0x27, 0x0a, + 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, + 0x67, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x6f, 0x72, + 0x65, 0x52, 0x0c, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x22, + 0xb9, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x54, 0x72, 0x61, + 0x63, 0x6b, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x37, 0x0a, 0x18, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6e, + 0x65, 0x78, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x65, + 0x78, 0x74, 0x48, 0x61, 0x73, 0x68, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1d, 0x0a, 0x0a, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x69, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x08, + 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x69, 0x67, 0x73, 0x22, 0x99, 0x02, 0x0a, 0x10, + 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x6f, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x76, 0x6f, 0x74, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x56, 0x6f, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x45, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x6c, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x12, + 0x54, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, + 0x66, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x52, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x65, 0x72, 0x66, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0xae, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x17, 0x0a, + 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x6d, 0x61, 0x78, 0x46, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x68, + 0x61, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x6d, 0x61, 0x78, 0x53, 0x68, 0x61, 0x70, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3b, 0x0a, 0x1a, + 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x17, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0x68, 0x0a, 0x1a, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, + 0x22, 0x80, 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x40, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x49, 0x64, 0x22, 0x80, 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x40, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x74, 0x49, 0x64, 0x22, 0x48, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x23, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0x77, 0x0a, + 0x16, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x40, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0x48, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x23, 0x0a, 0x06, 0x6f, - 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, - 0x22, 0x77, 0x0a, 0x16, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x40, 0x0a, 0x0c, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, - 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x0a, 0x09, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0x7f, 0x0a, 0x13, 0x4c, 0x69, 0x71, - 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x4b, 0x0a, 0x14, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, - 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0xa0, 0x01, 0x0a, 0x0f, 0x4c, - 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x36, - 0x0a, 0x17, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, - 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x15, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, - 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0x41, 0x0a, - 0x0e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, - 0x22, 0x86, 0x02, 0x0a, 0x15, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x50, 0x0a, 0x15, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x5f, 0x73, 0x6c, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, 0x4c, 0x41, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x52, 0x13, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x6c, 0x61, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x61, - 0x6b, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, - 0x79, 0x5f, 0x73, 0x6c, 0x6f, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x62, - 0x6f, 0x6e, 0x64, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x53, 0x6c, 0x6f, 0x70, 0x65, 0x12, - 0x28, 0x0a, 0x10, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x5f, - 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x6f, 0x6e, 0x64, 0x50, - 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x4d, 0x61, 0x78, 0x22, 0x75, 0x0a, 0x18, 0x4c, 0x69, 0x71, - 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, 0x61, 0x69, 0x64, 0x46, 0x65, 0x65, 0x73, - 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, - 0x22, 0x81, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, + 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0x7f, 0x0a, 0x13, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4b, 0x0a, + 0x14, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x4b, 0x0a, 0x14, 0x6c, 0x69, 0x71, 0x75, 0x69, + 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0xa0, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, + 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, + 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0x41, 0x0a, 0x0e, 0x4c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, + 0x72, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x22, 0x86, 0x02, + 0x0a, 0x15, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x49, 0x64, 0x12, 0x50, 0x0a, 0x15, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x73, + 0x6c, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x53, 0x4c, 0x41, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x52, 0x13, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x6c, 0x61, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, + 0x74, 0x6f, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x2c, + 0x0a, 0x12, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x5f, 0x73, + 0x6c, 0x6f, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x62, 0x6f, 0x6e, 0x64, + 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x53, 0x6c, 0x6f, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x10, + 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x5f, 0x6d, 0x61, 0x78, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x6f, 0x6e, 0x64, 0x50, 0x65, 0x6e, 0x61, + 0x6c, 0x74, 0x79, 0x4d, 0x61, 0x78, 0x22, 0x75, 0x0a, 0x18, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, 0x61, 0x69, 0x64, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, + 0x3c, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, + 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x81, 0x01, + 0x0a, 0x15, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x49, 0x64, 0x12, 0x4b, 0x0a, 0x14, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x6c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x97, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, + 0x32, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, + 0x5a, 0x0a, 0x1c, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x13, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x97, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, - 0x74, 0x79, 0x56, 0x32, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x49, 0x64, 0x12, 0x5a, 0x0a, 0x1c, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x1a, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x71, 0x75, 0x69, - 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc6, - 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, 0x65, - 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x64, 0x0a, 0x15, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x30, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, - 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x65, 0x72, 0x50, 0x61, 0x72, - 0x74, 0x79, 0x52, 0x13, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x50, - 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x22, 0x93, 0x05, 0x0a, 0x1e, 0x4c, 0x69, 0x71, 0x75, - 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, - 0x63, 0x65, 0x50, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x12, 0x4f, 0x0a, 0x25, 0x65, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, 0x61, 0x5f, 0x64, 0x75, 0x72, - 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x20, 0x65, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x65, 0x65, 0x74, - 0x69, 0x6e, 0x67, 0x53, 0x6c, 0x61, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x13, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x1e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x69, 0x65, 0x73, 0x5f, 0x70, 0x65, - 0x72, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1b, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x69, - 0x65, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x44, 0x0a, 0x1f, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, - 0x69, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x1b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x50, - 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x69, 0x65, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x12, 0x4a, 0x0a, 0x23, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x66, - 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x66, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, - 0x6f, 0x6e, 0x5f, 0x62, 0x6f, 0x6f, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x6c, - 0x61, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4f, 0x66, 0x54, 0x69, 0x6d, 0x65, 0x4f, 0x6e, 0x42, 0x6f, 0x6f, 0x6b, 0x12, 0x33, 0x0a, 0x16, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x70, - 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6c, 0x61, - 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x46, 0x65, 0x65, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, - 0x79, 0x12, 0x35, 0x0a, 0x17, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, - 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x6f, 0x6e, - 0x64, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x4c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x62, 0x75, 0x79, 0x73, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x42, 0x75, 0x79, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x6f, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x6c, - 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x9a, 0x02, - 0x0a, 0x11, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x53, 0x63, 0x6f, - 0x72, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, - 0x12, 0x36, 0x0a, 0x17, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x76, 0x65, 0x72, - 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x15, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, - 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x72, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x71, 0x75, - 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x72, - 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x64, - 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x6c, 0x61, 0x73, 0x74, 0x46, 0x65, 0x65, 0x44, - 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x39, 0x0a, 0x19, 0x66, 0x65, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x16, 0x66, 0x65, 0x65, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x65, 0x70, 0x22, 0xfd, 0x01, 0x0a, 0x13, 0x4c, - 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, - 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, - 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x5f, 0x72, 0x65, 0x61, - 0x63, 0x68, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, - 0x65, 0x6e, 0x73, 0x75, 0x73, 0x52, 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x12, 0x4d, 0x0a, 0x09, - 0x62, 0x69, 0x64, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x30, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x50, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x61, 0x69, - 0x72, 0x52, 0x08, 0x62, 0x69, 0x64, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x4d, 0x0a, 0x09, 0x61, - 0x73, 0x6b, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x50, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x61, 0x69, 0x72, - 0x52, 0x08, 0x61, 0x73, 0x6b, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0xb9, 0x01, 0x0a, 0x16, 0x46, - 0x6c, 0x6f, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x73, - 0x65, 0x6e, 0x73, 0x75, 0x73, 0x12, 0x4d, 0x0a, 0x11, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x52, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, - 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x1a, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc6, 0x01, 0x0a, 0x17, + 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, 0x65, 0x72, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x64, + 0x0a, 0x15, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0xfc, 0x01, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x56, 0x61, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x5d, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x5f, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, + 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x50, 0x65, 0x72, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, + 0x13, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x65, 0x72, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x22, 0x93, 0x05, 0x0a, 0x1e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x56, 0x32, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x50, + 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x4f, 0x0a, + 0x25, 0x65, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6d, 0x65, + 0x65, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6c, 0x61, 0x5f, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, + 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x20, 0x65, 0x6c, + 0x61, 0x70, 0x73, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, + 0x53, 0x6c, 0x61, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x32, + 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x1e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x69, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1b, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x69, 0x65, 0x73, 0x50, + 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x44, 0x0a, 0x1f, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x69, 0x65, 0x73, + 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x1b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x50, 0x65, 0x6e, 0x61, + 0x6c, 0x74, 0x69, 0x65, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x4a, 0x0a, + 0x23, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x66, 0x72, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x66, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, + 0x62, 0x6f, 0x6f, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x6c, 0x61, 0x73, 0x74, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x54, + 0x69, 0x6d, 0x65, 0x4f, 0x6e, 0x42, 0x6f, 0x6f, 0x6b, 0x12, 0x33, 0x0a, 0x16, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x70, 0x65, 0x6e, 0x61, + 0x6c, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x46, 0x65, 0x65, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x12, 0x35, + 0x0a, 0x17, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x62, 0x6f, 0x6e, + 0x64, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x14, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x6f, 0x6e, 0x64, 0x50, 0x65, + 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x11, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x62, 0x75, 0x79, 0x73, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x42, 0x75, 0x79, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x6c, 0x73, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x9a, 0x02, 0x0a, 0x11, 0x4c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, + 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, + 0x17, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, + 0x3b, 0x0a, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x17, 0x6c, 0x61, 0x73, 0x74, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x19, + 0x66, 0x65, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x16, 0x66, 0x65, 0x65, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x69, 0x6d, 0x65, 0x53, 0x74, 0x65, 0x70, 0x22, 0xfd, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x56, 0x32, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, + 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, + 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x68, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, + 0x75, 0x73, 0x52, 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x12, 0x4d, 0x0a, 0x09, 0x62, 0x69, 0x64, + 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x61, 0x69, 0x72, 0x52, 0x08, + 0x62, 0x69, 0x64, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x4d, 0x0a, 0x09, 0x61, 0x73, 0x6b, 0x5f, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x50, 0x72, + 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x61, 0x69, 0x72, 0x52, 0x08, 0x61, + 0x73, 0x6b, 0x43, 0x61, 0x63, 0x68, 0x65, 0x22, 0xb9, 0x01, 0x0a, 0x16, 0x46, 0x6c, 0x6f, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, + 0x75, 0x73, 0x12, 0x4d, 0x0a, 0x11, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x11, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x12, 0x43, 0x0a, 0x1e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x5f, 0x6d, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x66, 0x75, 0x6c, 0x5f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1b, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x73, - 0x53, 0x69, 0x6e, 0x63, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x66, 0x75, 0x6c, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x5c, 0x0a, 0x1c, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4b, 0x65, 0x79, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x06, 0x62, 0x75, 0x6e, - 0x64, 0x6c, 0x65, 0x22, 0x72, 0x0a, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6e, 0x65, 0x78, 0x74, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0x9b, 0x03, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x0f, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x52, 0x0e, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x12, 0x5b, 0x0a, - 0x15, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x13, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x25, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x74, - 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x6f, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, - 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x52, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x6f, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, + 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x52, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x12, 0x50, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x22, 0xfc, 0x01, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x5d, + 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x5f, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6c, + 0x6f, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x43, 0x0a, + 0x1e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x65, + 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x66, 0x75, 0x6c, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1b, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x53, 0x69, 0x6e, + 0x63, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x66, 0x75, 0x6c, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x22, 0x5c, 0x0a, 0x1c, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x22, 0x72, 0x0a, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x22, 0x9b, 0x03, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, + 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x0f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x29, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x79, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x52, 0x0e, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x12, 0x5b, 0x0a, 0x15, 0x74, 0x61, + 0x6b, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x12, 0x51, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x61, 0x6b, 0x65, - 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, - 0x72, 0x46, 0x65, 0x65, 0x73, 0x52, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x61, 0x6b, 0x65, - 0x72, 0x46, 0x65, 0x65, 0x73, 0x22, 0x74, 0x0a, 0x16, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x40, 0x0a, 0x06, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x1d, + 0x6d, 0x65, 0x52, 0x13, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x25, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x74, 0x61, 0x6b, 0x65, + 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x54, 0x6f, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x4e, + 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x20, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x6f, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, + 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, + 0x51, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, + 0x65, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, + 0x65, 0x73, 0x52, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, + 0x65, 0x73, 0x22, 0x74, 0x0a, 0x16, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x50, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x40, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x1d, 0x45, 0x52, 0x43, + 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, + 0x67, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x67, + 0x6e, 0x65, 0x72, 0x73, 0x12, 0x56, 0x0a, 0x12, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, + 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x50, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x10, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x50, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4c, 0x0a, 0x09, + 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x54, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, + 0x65, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0a, 0x73, 0x65, 0x65, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xbc, 0x02, 0x0a, 0x1c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x54, 0x6f, 0x70, - 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x56, 0x0a, 0x12, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x10, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x4c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, - 0x67, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x1f, 0x0a, - 0x0b, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x65, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xbc, - 0x02, 0x0a, 0x1c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, - 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, - 0x51, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x52, 0x0e, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, - 0x72, 0x73, 0x12, 0x62, 0x0a, 0x15, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x51, 0x0a, 0x0f, + 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x53, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x0e, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x12, + 0x62, 0x0a, 0x15, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x13, + 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x53, 0x65, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, + 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, + 0x12, 0x38, 0x0a, 0x18, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x74, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x16, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x64, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x73, 0x22, 0xc7, 0x01, 0x0a, 0x13, 0x45, + 0x56, 0x4d, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x4b, 0x0a, + 0x08, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, - 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x52, 0x13, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, - 0x73, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x10, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x67, 0x6e, - 0x65, 0x72, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x64, - 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x65, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x64, - 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x73, 0x22, 0xc7, 0x01, - 0x0a, 0x13, 0x45, 0x56, 0x4d, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x54, 0x6f, 0x70, - 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, - 0x12, 0x4b, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, - 0x53, 0x69, 0x67, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x52, 0x08, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x48, 0x0a, - 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x54, - 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x07, - 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x72, 0x0a, 0x15, 0x45, 0x56, 0x4d, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, - 0x12, 0x59, 0x0a, 0x15, 0x65, 0x76, 0x6d, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, - 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x45, 0x56, 0x4d, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x54, 0x6f, - 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x13, 0x65, 0x76, 0x6d, 0x4d, 0x75, 0x6c, 0x74, 0x69, - 0x73, 0x69, 0x67, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x22, 0xa5, 0x04, 0x0a, 0x0b, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x48, 0x0a, - 0x0c, 0x74, 0x78, 0x5f, 0x61, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x0a, 0x74, 0x78, 0x41, - 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4a, 0x0a, 0x0d, 0x74, 0x69, 0x64, 0x5f, 0x61, - 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, + 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x52, 0x08, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x07, 0x70, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x54, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x70, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x22, 0x72, 0x0a, 0x15, 0x45, 0x56, 0x4d, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x73, 0x69, 0x67, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x12, 0x59, 0x0a, + 0x15, 0x65, 0x76, 0x6d, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x74, 0x6f, + 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x56, 0x4d, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x54, 0x6f, 0x70, 0x6f, 0x6c, + 0x6f, 0x67, 0x79, 0x52, 0x13, 0x65, 0x76, 0x6d, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, + 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x22, 0xa5, 0x04, 0x0a, 0x0b, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0b, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x48, 0x0a, 0x0c, 0x74, 0x78, + 0x5f, 0x61, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x0a, 0x74, 0x78, 0x41, 0x74, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x12, 0x4a, 0x0a, 0x0d, 0x74, 0x69, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x52, 0x0b, 0x74, 0x69, 0x64, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x12, 0x35, 0x0a, 0x06, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, + 0x06, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x0a, 0x70, 0x6f, 0x77, 0x5f, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x52, 0x09, 0x70, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x70, + 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, - 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x0b, 0x74, 0x69, 0x64, 0x41, 0x74, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x12, 0x35, 0x0a, 0x06, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x61, 0x72, - 0x74, 0x79, 0x52, 0x06, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x0a, 0x70, 0x6f, - 0x77, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x08, 0x70, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x12, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x72, + 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x54, 0x0a, 0x14, 0x6e, 0x6f, + 0x6e, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x73, 0x5f, 0x61, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x6e, 0x63, + 0x65, 0x52, 0x65, 0x66, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x11, 0x6e, + 0x6f, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x66, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x22, 0x39, 0x0a, 0x0b, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0x84, 0x03, 0x0a, 0x11, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x41, 0x0a, 0x1e, 0x73, 0x70, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x77, 0x5f, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x73, 0x70, 0x61, 0x6d, 0x50, + 0x6f, 0x77, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x50, 0x61, 0x73, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x70, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x77, + 0x5f, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x11, 0x73, 0x70, 0x61, 0x6d, 0x50, 0x6f, 0x77, 0x44, 0x69, 0x66, 0x66, 0x69, 0x63, + 0x75, 0x6c, 0x74, 0x79, 0x12, 0x33, 0x0a, 0x16, 0x73, 0x70, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x77, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x73, 0x70, 0x61, 0x6d, 0x50, 0x6f, 0x77, 0x48, 0x61, 0x73, + 0x68, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x1f, 0x73, 0x70, 0x61, + 0x6d, 0x5f, 0x70, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, + 0x74, 0x78, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x19, 0x73, 0x70, 0x61, 0x6d, 0x50, 0x6f, 0x77, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x4f, 0x66, 0x54, 0x78, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x43, 0x0a, + 0x1e, 0x73, 0x70, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, + 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x73, 0x70, 0x61, 0x6d, 0x50, 0x6f, 0x77, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, + 0x74, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x22, 0x58, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, + 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x44, 0x0a, 0x09, 0x70, 0x6f, 0x77, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x08, 0x70, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x8c, 0x01, 0x0a, + 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x50, 0x0a, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x52, 0x09, 0x70, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x3f, - 0x0a, 0x09, 0x70, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x08, 0x70, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x2c, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x5f, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x6c, 0x61, 0x73, - 0x74, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x54, 0x0a, - 0x14, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x73, 0x5f, 0x61, 0x74, 0x5f, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4e, - 0x6f, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x66, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x52, 0x11, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x66, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x22, 0x39, 0x0a, 0x0b, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x50, 0x61, 0x72, - 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, - 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0x84, - 0x03, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x41, 0x0a, 0x1e, 0x73, 0x70, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x77, - 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x61, 0x73, 0x74, 0x5f, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x73, 0x70, - 0x61, 0x6d, 0x50, 0x6f, 0x77, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x50, 0x61, 0x73, - 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x70, 0x61, 0x6d, 0x5f, - 0x70, 0x6f, 0x77, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x73, 0x70, 0x61, 0x6d, 0x50, 0x6f, 0x77, 0x44, 0x69, 0x66, - 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x33, 0x0a, 0x16, 0x73, 0x70, 0x61, 0x6d, 0x5f, - 0x70, 0x6f, 0x77, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x73, 0x70, 0x61, 0x6d, 0x50, 0x6f, 0x77, - 0x48, 0x61, 0x73, 0x68, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x1f, - 0x73, 0x70, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x77, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, - 0x6f, 0x66, 0x5f, 0x74, 0x78, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x73, 0x70, 0x61, 0x6d, 0x50, 0x6f, 0x77, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, 0x78, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x43, 0x0a, 0x1e, 0x73, 0x70, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x63, - 0x72, 0x65, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, - 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x73, 0x70, 0x61, 0x6d, 0x50, 0x6f, - 0x77, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x66, 0x66, 0x69, - 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x75, 0x6e, 0x74, 0x69, 0x6c, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x58, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, - 0x57, 0x6f, 0x72, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x44, 0x0a, 0x09, 0x70, 0x6f, 0x77, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, + 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, + 0x0a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x1d, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x74, 0x79, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x14, 0x0a, + 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x73, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x64, + 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x44, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, + 0x6c, 0x74, 0x79, 0x22, 0x52, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x36, 0x0a, 0x08, 0x4e, 0x6f, 0x6e, 0x63, 0x65, + 0x52, 0x65, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x22, + 0x5b, 0x0a, 0x11, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x66, 0x73, 0x41, 0x74, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2e, 0x0a, 0x04, + 0x72, 0x65, 0x66, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x6e, 0x63, 0x65, 0x52, 0x65, 0x66, 0x52, 0x04, 0x72, 0x65, 0x66, 0x73, 0x22, 0xcb, 0x01, 0x0a, + 0x18, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x12, 0x4f, 0x0a, 0x10, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x12, 0x5e, 0x0a, 0x11, 0x61, 0x63, + 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, + 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x10, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, + 0x65, 0x64, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x22, 0x7d, 0x0a, 0x1f, 0x41, 0x63, + 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x30, 0x0a, + 0x14, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, + 0x28, 0x0a, 0x10, 0x76, 0x65, 0x67, 0x61, 0x5f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, + 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x65, 0x67, 0x61, 0x52, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x61, 0x67, 0x22, 0x35, 0x0a, 0x05, 0x54, 0x65, 0x61, + 0x6d, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, + 0x22, 0xae, 0x02, 0x0a, 0x04, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x08, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x52, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x55, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, + 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, + 0x74, 0x22, 0x6e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, + 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x6f, + 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6a, + 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x22, 0x51, 0x0a, 0x0c, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, + 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, + 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x52, 0x0c, 0x74, 0x65, 0x61, 0x6d, 0x53, 0x77, 0x69, 0x74, + 0x63, 0x68, 0x65, 0x73, 0x22, 0x67, 0x0a, 0x0a, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x77, 0x69, 0x74, + 0x63, 0x68, 0x12, 0x20, 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x54, 0x65, + 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x0a, 0x74, 0x6f, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x54, 0x65, 0x61, 0x6d, + 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x22, 0x4f, 0x0a, + 0x07, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x44, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x52, + 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x22, 0xa1, + 0x01, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x12, 0x40, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c, 0x6f, + 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x69, 0x6e, 0x5f, 0x76, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, + 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x09, 0x69, 0x6e, 0x56, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x22, 0xed, 0x02, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x11, 0x66, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x62, 0x79, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, + 0x79, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x52, 0x0f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, + 0x42, 0x79, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x3e, 0x0a, 0x0f, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, + 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x12, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x68, + 0x61, 0x73, 0x5f, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, 0x61, 0x73, 0x45, 0x6e, 0x64, 0x65, 0x64, 0x12, + 0x31, 0x0a, 0x04, 0x73, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x04, 0x73, 0x65, + 0x74, 0x73, 0x22, 0xd6, 0x03, 0x0a, 0x0b, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, + 0x65, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x38, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, + 0x52, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x08, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x08, 0x70, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, - 0x8c, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x50, 0x0a, 0x0b, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x85, - 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x4f, 0x66, 0x57, 0x6f, 0x72, 0x6b, 0x50, 0x61, - 0x72, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x73, 0x65, 0x65, 0x6e, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x44, 0x69, 0x66, 0x66, - 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x22, 0x52, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x36, 0x0a, 0x08, 0x4e, 0x6f, - 0x6e, 0x63, 0x65, 0x52, 0x65, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, - 0x63, 0x65, 0x22, 0x5b, 0x0a, 0x11, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x66, 0x73, 0x41, - 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, - 0x2e, 0x0a, 0x04, 0x72, 0x65, 0x66, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x08, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x66, 0x52, 0x04, 0x72, 0x65, 0x66, 0x73, 0x22, - 0xcb, 0x01, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, - 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x12, 0x4f, 0x0a, 0x10, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x12, 0x5e, 0x0a, - 0x11, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, - 0x70, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, - 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x10, 0x61, 0x63, 0x63, - 0x65, 0x70, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x22, 0x7d, 0x0a, - 0x1f, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 0x12, 0x30, 0x0a, 0x14, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, - 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x76, 0x65, 0x67, 0x61, 0x5f, 0x72, 0x65, 0x6c, 0x65, 0x61, - 0x73, 0x65, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x65, - 0x67, 0x61, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x61, 0x67, 0x22, 0x35, 0x0a, 0x05, - 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x05, 0x74, 0x65, - 0x61, 0x6d, 0x73, 0x22, 0xae, 0x02, 0x0a, 0x04, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x08, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x0e, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x32, + 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x46, 0x61, 0x63, 0x74, + 0x6f, 0x72, 0x12, 0x3c, 0x0a, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, + 0x12, 0x49, 0x0a, 0x21, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x73, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x22, 0x3d, 0x0a, 0x0d, 0x52, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x73, 0x0a, 0x0f, 0x46, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x42, 0x79, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x64, 0x69, + 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x21, 0x0a, 0x0c, + 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, + 0x6a, 0x0a, 0x0b, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x12, 0x45, 0x0a, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x62, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x0d, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x0c, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x3b, 0x0a, 0x09, 0x49, + 0x6e, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x6f, 0x0a, 0x0e, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x12, 0x5d, 0x0a, 0x17, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6b, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6b, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x22, 0xe1, 0x01, 0x0a, 0x13, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x08, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x44, 0x0a, 0x1e, 0x72, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x1c, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x44, 0x69, 0x73, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, + 0x72, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x76, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x17, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x56, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x22, 0xb4, 0x04, + 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x12, 0x53, 0x0a, 0x13, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x08, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x55, 0x72, 0x6c, 0x12, - 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x1d, - 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x63, - 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, - 0x69, 0x73, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x4c, 0x69, 0x73, 0x74, 0x22, 0x6e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, - 0x69, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x1b, 0x0a, - 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x22, 0x51, 0x0a, 0x0c, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x77, 0x69, 0x74, - 0x63, 0x68, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x77, 0x69, - 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x65, 0x61, 0x6d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x52, 0x0c, 0x74, 0x65, 0x61, 0x6d, 0x53, - 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x73, 0x22, 0x67, 0x0a, 0x0a, 0x54, 0x65, 0x61, 0x6d, 0x53, - 0x77, 0x69, 0x74, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x74, 0x65, - 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x72, 0x6f, - 0x6d, 0x54, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x0a, 0x74, 0x6f, 0x5f, 0x74, 0x65, - 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x54, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, - 0x22, 0x4f, 0x0a, 0x07, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x44, 0x0a, 0x0e, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x22, 0xa1, 0x01, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x40, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x0b, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x0a, 0x69, 0x6e, 0x5f, - 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x6e, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x09, 0x69, 0x6e, 0x56, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0xed, 0x02, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, - 0x11, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x62, 0x79, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x63, 0x74, - 0x6f, 0x72, 0x42, 0x79, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x52, 0x0f, 0x66, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x42, 0x79, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x3e, 0x0a, 0x0f, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x0e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x36, 0x0a, 0x0b, - 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, - 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, 0x61, 0x73, 0x45, 0x6e, 0x64, - 0x65, 0x64, 0x12, 0x31, 0x0a, 0x04, 0x73, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, - 0x04, 0x73, 0x65, 0x74, 0x73, 0x22, 0xd6, 0x03, 0x0a, 0x0b, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x61, 0x6c, 0x53, 0x65, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, - 0x68, 0x69, 0x70, 0x52, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x12, 0x38, 0x0a, - 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x08, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x52, 0x0e, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x46, - 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3c, 0x0a, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, - 0x69, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, - 0x69, 0x65, 0x72, 0x12, 0x49, 0x0a, 0x21, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1e, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x46, 0x61, - 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x22, 0x3d, - 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x73, 0x0a, - 0x0f, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x79, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x22, 0x6a, 0x0a, 0x0b, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x45, 0x0a, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, - 0x0d, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x3e, - 0x0a, 0x0c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x3b, - 0x0a, 0x09, 0x49, 0x6e, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x6f, 0x0a, 0x0e, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x12, 0x5d, 0x0a, - 0x17, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, - 0x79, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, + 0x31, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x73, 0x52, 0x11, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x4f, 0x0a, 0x14, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, + 0x79, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x22, 0xe1, 0x01, 0x0a, - 0x13, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x44, - 0x0a, 0x1e, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x1c, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x44, 0x69, - 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, - 0x6c, 0x69, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x76, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x17, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x56, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, - 0x22, 0xb4, 0x04, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x12, 0x53, 0x0a, 0x13, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x52, 0x11, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, - 0x74, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x4f, 0x0a, 0x14, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x52, 0x12, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, - 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x3c, 0x0a, 0x0b, 0x6e, 0x65, - 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x0a, 0x6e, 0x65, - 0x77, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x4f, 0x0a, 0x10, 0x66, 0x61, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0e, 0x66, 0x61, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x42, 0x79, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x65, 0x6e, 0x64, 0x65, 0x64, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, - 0x61, 0x73, 0x45, 0x6e, 0x64, 0x65, 0x64, 0x22, 0x54, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, - 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x55, 0x0a, - 0x11, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x73, 0x12, 0x40, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, - 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1f, - 0x0a, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x6f, 0x73, 0x12, - 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x53, 0x74, 0x65, 0x70, 0x12, 0x31, 0x0a, 0x06, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, - 0x56, 0x0a, 0x10, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x41, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x73, 0x0a, 0x1b, 0x42, 0x61, 0x6e, 0x6b, 0x69, - 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x54, 0x0a, 0x14, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x79, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xe4, 0x02, 0x0a, - 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, - 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x12, 0x52, 0x0a, 0x13, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, - 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x12, 0x70, 0x72, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x64, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, 0x72, - 0x61, 0x64, 0x65, 0x52, 0x06, 0x74, 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, - 0x72, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x12, 0x37, 0x0a, 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x03, 0x52, 0x15, 0x70, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, - 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x48, 0x0a, 0x12, 0x62, 0x6f, 0x6f, - 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x52, 0x0f, 0x62, 0x6f, 0x6f, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x41, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x3a, - 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x52, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x6b, 0x0a, 0x0c, 0x50, 0x61, - 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2a, 0x0a, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x32, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x12, 0x61, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x12, 0x44, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, + 0x67, 0x72, 0x61, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x3c, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x4f, 0x0a, 0x10, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x5f, 0x62, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0e, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x42, + 0x79, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x61, 0x6d, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, 0x61, 0x73, 0x45, + 0x6e, 0x64, 0x65, 0x64, 0x22, 0x54, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, + 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x11, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, + 0x40, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x22, 0x3b, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x9b, + 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, + 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0a, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x6f, 0x73, 0x12, 0x1b, 0x0a, 0x09, + 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x08, 0x6e, 0x65, 0x78, 0x74, 0x53, 0x74, 0x65, 0x70, 0x12, 0x31, 0x0a, 0x06, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, + 0x74, 0x65, 0x67, 0x79, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x56, 0x0a, 0x10, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x73, 0x0a, 0x1b, 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x12, 0x54, 0x0a, 0x14, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x41, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x79, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xe4, 0x02, 0x0a, 0x18, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x61, 0x6c, 0x63, + 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, + 0x52, 0x0a, 0x13, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x12, 0x70, 0x72, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x64, 0x65, + 0x52, 0x06, 0x74, 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x37, 0x0a, + 0x18, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x52, + 0x15, 0x70, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x48, 0x0a, 0x12, 0x62, 0x6f, 0x6f, 0x6b, 0x5f, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, + 0x0f, 0x62, 0x6f, 0x6f, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x22, 0x45, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x08, 0x70, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x70, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x6b, 0x0a, 0x0c, 0x50, 0x61, 0x72, 0x74, 0x79, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x61, 0x0a, 0x09, 0x41, 0x4d, 0x4d, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x6b, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x22, 0x75, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x70, 0x72, 0x69, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x2a, 0x60, 0x0a, 0x06, 0x46, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x16, 0x0a, 0x12, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, - 0x0c, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x10, 0x01, 0x12, - 0x1b, 0x0a, 0x17, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x5f, - 0x43, 0x4f, 0x4d, 0x50, 0x52, 0x45, 0x53, 0x53, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, - 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x03, 0x42, 0x33, 0x5a, - 0x31, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2f, - 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x0a, 0x70, 0x72, 0x69, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x69, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x63, 0x6b, 0x12, + 0x2d, 0x0a, 0x03, 0x61, 0x6d, 0x6d, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x4d, 0x4d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x03, 0x61, 0x6d, 0x6d, 0x2a, 0x60, + 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x16, 0x0a, 0x12, 0x46, 0x4f, 0x52, 0x4d, + 0x41, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, + 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x50, 0x52, 0x4f, + 0x54, 0x4f, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x52, 0x45, 0x53, 0x53, 0x45, 0x44, 0x10, 0x02, 0x12, + 0x0f, 0x0a, 0x0b, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x03, + 0x42, 0x33, 0x5a, 0x31, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -16413,244 +16948,252 @@ func file_vega_snapshot_v1_snapshot_proto_rawDescGZIP() []byte { } var file_vega_snapshot_v1_snapshot_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_vega_snapshot_v1_snapshot_proto_msgTypes = make([]protoimpl.MessageInfo, 189) +var file_vega_snapshot_v1_snapshot_proto_msgTypes = make([]protoimpl.MessageInfo, 195) var file_vega_snapshot_v1_snapshot_proto_goTypes = []interface{}{ - (Format)(0), // 0: vega.snapshot.v1.Format - (*Snapshot)(nil), // 1: vega.snapshot.v1.Snapshot - (*NodeHash)(nil), // 2: vega.snapshot.v1.NodeHash - (*Metadata)(nil), // 3: vega.snapshot.v1.Metadata - (*Chunk)(nil), // 4: vega.snapshot.v1.Chunk - (*Payload)(nil), // 5: vega.snapshot.v1.Payload - (*OrderHoldingQuantities)(nil), // 6: vega.snapshot.v1.OrderHoldingQuantities - (*HoldingAccountTracker)(nil), // 7: vega.snapshot.v1.HoldingAccountTracker - (*TimestampedTotalStake)(nil), // 8: vega.snapshot.v1.TimestampedTotalStake - (*TimestampedOpenInterest)(nil), // 9: vega.snapshot.v1.TimestampedOpenInterest - (*LiquidityTarget)(nil), // 10: vega.snapshot.v1.LiquidityTarget - (*SpotLiquidityTarget)(nil), // 11: vega.snapshot.v1.SpotLiquidityTarget - (*LiquidityOffsetProbabilityPair)(nil), // 12: vega.snapshot.v1.LiquidityOffsetProbabilityPair - (*LiquiditySupplied)(nil), // 13: vega.snapshot.v1.LiquiditySupplied - (*OracleDataBatch)(nil), // 14: vega.snapshot.v1.OracleDataBatch - (*OracleData)(nil), // 15: vega.snapshot.v1.OracleData - (*OracleDataPair)(nil), // 16: vega.snapshot.v1.OracleDataPair - (*Witness)(nil), // 17: vega.snapshot.v1.Witness - (*Resource)(nil), // 18: vega.snapshot.v1.Resource - (*EventForwarderBucket)(nil), // 19: vega.snapshot.v1.EventForwarderBucket - (*EventForwarder)(nil), // 20: vega.snapshot.v1.EventForwarder - (*CollateralAccounts)(nil), // 21: vega.snapshot.v1.CollateralAccounts - (*CollateralAssets)(nil), // 22: vega.snapshot.v1.CollateralAssets - (*ActiveAssets)(nil), // 23: vega.snapshot.v1.ActiveAssets - (*PendingAssets)(nil), // 24: vega.snapshot.v1.PendingAssets - (*PendingAssetUpdates)(nil), // 25: vega.snapshot.v1.PendingAssetUpdates - (*Withdrawal)(nil), // 26: vega.snapshot.v1.Withdrawal - (*Deposit)(nil), // 27: vega.snapshot.v1.Deposit - (*TxRef)(nil), // 28: vega.snapshot.v1.TxRef - (*BankingWithdrawals)(nil), // 29: vega.snapshot.v1.BankingWithdrawals - (*BankingDeposits)(nil), // 30: vega.snapshot.v1.BankingDeposits - (*BankingSeen)(nil), // 31: vega.snapshot.v1.BankingSeen - (*BankingAssetActions)(nil), // 32: vega.snapshot.v1.BankingAssetActions - (*BankingRecurringTransfers)(nil), // 33: vega.snapshot.v1.BankingRecurringTransfers - (*BankingScheduledTransfers)(nil), // 34: vega.snapshot.v1.BankingScheduledTransfers - (*BankingRecurringGovernanceTransfers)(nil), // 35: vega.snapshot.v1.BankingRecurringGovernanceTransfers - (*BankingScheduledGovernanceTransfers)(nil), // 36: vega.snapshot.v1.BankingScheduledGovernanceTransfers - (*BankingBridgeState)(nil), // 37: vega.snapshot.v1.BankingBridgeState - (*BankingEVMBridgeStates)(nil), // 38: vega.snapshot.v1.BankingEVMBridgeStates - (*Checkpoint)(nil), // 39: vega.snapshot.v1.Checkpoint - (*DelegationLastReconciliationTime)(nil), // 40: vega.snapshot.v1.DelegationLastReconciliationTime - (*DelegationActive)(nil), // 41: vega.snapshot.v1.DelegationActive - (*DelegationPending)(nil), // 42: vega.snapshot.v1.DelegationPending - (*DelegationAuto)(nil), // 43: vega.snapshot.v1.DelegationAuto - (*ProposalData)(nil), // 44: vega.snapshot.v1.ProposalData - (*GovernanceEnacted)(nil), // 45: vega.snapshot.v1.GovernanceEnacted - (*GovernanceActive)(nil), // 46: vega.snapshot.v1.GovernanceActive - (*BatchProposalData)(nil), // 47: vega.snapshot.v1.BatchProposalData - (*GovernanceBatchActive)(nil), // 48: vega.snapshot.v1.GovernanceBatchActive - (*GovernanceNode)(nil), // 49: vega.snapshot.v1.GovernanceNode - (*StakingAccount)(nil), // 50: vega.snapshot.v1.StakingAccount - (*StakingAccounts)(nil), // 51: vega.snapshot.v1.StakingAccounts - (*MatchingBook)(nil), // 52: vega.snapshot.v1.MatchingBook - (*NetParams)(nil), // 53: vega.snapshot.v1.NetParams - (*DecimalMap)(nil), // 54: vega.snapshot.v1.DecimalMap - (*TimePrice)(nil), // 55: vega.snapshot.v1.TimePrice - (*PriceVolume)(nil), // 56: vega.snapshot.v1.PriceVolume - (*PriceRange)(nil), // 57: vega.snapshot.v1.PriceRange - (*PriceBound)(nil), // 58: vega.snapshot.v1.PriceBound - (*PriceRangeCache)(nil), // 59: vega.snapshot.v1.PriceRangeCache - (*CurrentPrice)(nil), // 60: vega.snapshot.v1.CurrentPrice - (*PastPrice)(nil), // 61: vega.snapshot.v1.PastPrice - (*PriceMonitor)(nil), // 62: vega.snapshot.v1.PriceMonitor - (*AuctionState)(nil), // 63: vega.snapshot.v1.AuctionState - (*EquityShareLP)(nil), // 64: vega.snapshot.v1.EquityShareLP - (*EquityShare)(nil), // 65: vega.snapshot.v1.EquityShare - (*FeeSplitter)(nil), // 66: vega.snapshot.v1.FeeSplitter - (*SpotMarket)(nil), // 67: vega.snapshot.v1.SpotMarket - (*Market)(nil), // 68: vega.snapshot.v1.Market - (*PartyMarginFactor)(nil), // 69: vega.snapshot.v1.PartyMarginFactor - (*Product)(nil), // 70: vega.snapshot.v1.Product - (*DataPoint)(nil), // 71: vega.snapshot.v1.DataPoint - (*AuctionIntervals)(nil), // 72: vega.snapshot.v1.AuctionIntervals - (*TWAPData)(nil), // 73: vega.snapshot.v1.TWAPData - (*Perps)(nil), // 74: vega.snapshot.v1.Perps - (*OrdersAtPrice)(nil), // 75: vega.snapshot.v1.OrdersAtPrice - (*PricedStopOrders)(nil), // 76: vega.snapshot.v1.PricedStopOrders - (*TrailingStopOrders)(nil), // 77: vega.snapshot.v1.TrailingStopOrders - (*OrdersAtOffset)(nil), // 78: vega.snapshot.v1.OrdersAtOffset - (*OffsetsAtPrice)(nil), // 79: vega.snapshot.v1.OffsetsAtPrice - (*StopOrders)(nil), // 80: vega.snapshot.v1.StopOrders - (*PeggedOrders)(nil), // 81: vega.snapshot.v1.PeggedOrders - (*SLANetworkParams)(nil), // 82: vega.snapshot.v1.SLANetworkParams - (*ExecutionMarkets)(nil), // 83: vega.snapshot.v1.ExecutionMarkets - (*Successors)(nil), // 84: vega.snapshot.v1.Successors - (*Position)(nil), // 85: vega.snapshot.v1.Position - (*MarketPositions)(nil), // 86: vega.snapshot.v1.MarketPositions - (*PartyPositionStats)(nil), // 87: vega.snapshot.v1.PartyPositionStats - (*SettlementState)(nil), // 88: vega.snapshot.v1.SettlementState - (*LastSettledPosition)(nil), // 89: vega.snapshot.v1.LastSettledPosition - (*SettlementTrade)(nil), // 90: vega.snapshot.v1.SettlementTrade - (*AppState)(nil), // 91: vega.snapshot.v1.AppState - (*EpochState)(nil), // 92: vega.snapshot.v1.EpochState - (*RewardsPendingPayouts)(nil), // 93: vega.snapshot.v1.RewardsPendingPayouts - (*ScheduledRewardsPayout)(nil), // 94: vega.snapshot.v1.ScheduledRewardsPayout - (*RewardsPayout)(nil), // 95: vega.snapshot.v1.RewardsPayout - (*RewardsPartyAmount)(nil), // 96: vega.snapshot.v1.RewardsPartyAmount - (*LimitState)(nil), // 97: vega.snapshot.v1.LimitState - (*VoteSpamPolicy)(nil), // 98: vega.snapshot.v1.VoteSpamPolicy - (*PartyProposalVoteCount)(nil), // 99: vega.snapshot.v1.PartyProposalVoteCount - (*PartyTokenBalance)(nil), // 100: vega.snapshot.v1.PartyTokenBalance - (*BlockRejectStats)(nil), // 101: vega.snapshot.v1.BlockRejectStats - (*SpamPartyTransactionCount)(nil), // 102: vega.snapshot.v1.SpamPartyTransactionCount - (*SimpleSpamPolicy)(nil), // 103: vega.snapshot.v1.SimpleSpamPolicy - (*NotarySigs)(nil), // 104: vega.snapshot.v1.NotarySigs - (*Notary)(nil), // 105: vega.snapshot.v1.Notary - (*StakeVerifierDeposited)(nil), // 106: vega.snapshot.v1.StakeVerifierDeposited - (*StakeVerifierRemoved)(nil), // 107: vega.snapshot.v1.StakeVerifierRemoved - (*StakeVerifierPending)(nil), // 108: vega.snapshot.v1.StakeVerifierPending - (*L2EthOracles)(nil), // 109: vega.snapshot.v1.L2EthOracles - (*ChainIdEthOracles)(nil), // 110: vega.snapshot.v1.ChainIdEthOracles - (*EthOracleVerifierLastBlock)(nil), // 111: vega.snapshot.v1.EthOracleVerifierLastBlock - (*EthOracleVerifierMisc)(nil), // 112: vega.snapshot.v1.EthOracleVerifierMisc - (*EthContractCallResults)(nil), // 113: vega.snapshot.v1.EthContractCallResults - (*EthContractCallResult)(nil), // 114: vega.snapshot.v1.EthContractCallResult - (*EthVerifierBucket)(nil), // 115: vega.snapshot.v1.EthVerifierBucket - (*PendingKeyRotation)(nil), // 116: vega.snapshot.v1.PendingKeyRotation - (*PendingEthereumKeyRotation)(nil), // 117: vega.snapshot.v1.PendingEthereumKeyRotation - (*Topology)(nil), // 118: vega.snapshot.v1.Topology - (*ToplogySignatures)(nil), // 119: vega.snapshot.v1.ToplogySignatures - (*PendingERC20MultisigControlSignature)(nil), // 120: vega.snapshot.v1.PendingERC20MultisigControlSignature - (*IssuedERC20MultisigControlSignature)(nil), // 121: vega.snapshot.v1.IssuedERC20MultisigControlSignature - (*ValidatorState)(nil), // 122: vega.snapshot.v1.ValidatorState - (*HeartbeatTracker)(nil), // 123: vega.snapshot.v1.HeartbeatTracker - (*PerformanceStats)(nil), // 124: vega.snapshot.v1.PerformanceStats - (*ValidatorPerformance)(nil), // 125: vega.snapshot.v1.ValidatorPerformance - (*LiquidityParameters)(nil), // 126: vega.snapshot.v1.LiquidityParameters - (*LiquidityPendingProvisions)(nil), // 127: vega.snapshot.v1.LiquidityPendingProvisions - (*LiquidityPartiesLiquidityOrders)(nil), // 128: vega.snapshot.v1.LiquidityPartiesLiquidityOrders - (*PartyOrders)(nil), // 129: vega.snapshot.v1.PartyOrders - (*LiquidityPartiesOrders)(nil), // 130: vega.snapshot.v1.LiquidityPartiesOrders - (*LiquidityProvisions)(nil), // 131: vega.snapshot.v1.LiquidityProvisions - (*LiquidityScores)(nil), // 132: vega.snapshot.v1.LiquidityScores - (*LiquidityScore)(nil), // 133: vega.snapshot.v1.LiquidityScore - (*LiquidityV2Parameters)(nil), // 134: vega.snapshot.v1.LiquidityV2Parameters - (*LiquidityV2PaidFeesStats)(nil), // 135: vega.snapshot.v1.LiquidityV2PaidFeesStats - (*LiquidityV2Provisions)(nil), // 136: vega.snapshot.v1.LiquidityV2Provisions - (*LiquidityV2PendingProvisions)(nil), // 137: vega.snapshot.v1.LiquidityV2PendingProvisions - (*LiquidityV2Performances)(nil), // 138: vega.snapshot.v1.LiquidityV2Performances - (*LiquidityV2PerformancePerParty)(nil), // 139: vega.snapshot.v1.LiquidityV2PerformancePerParty - (*LiquidityV2Scores)(nil), // 140: vega.snapshot.v1.LiquidityV2Scores - (*LiquidityV2Supplied)(nil), // 141: vega.snapshot.v1.LiquidityV2Supplied - (*FloatingPointConsensus)(nil), // 142: vega.snapshot.v1.FloatingPointConsensus - (*StateVarInternalState)(nil), // 143: vega.snapshot.v1.StateVarInternalState - (*FloatingPointValidatorResult)(nil), // 144: vega.snapshot.v1.FloatingPointValidatorResult - (*NextTimeTrigger)(nil), // 145: vega.snapshot.v1.NextTimeTrigger - (*MarketTracker)(nil), // 146: vega.snapshot.v1.MarketTracker - (*SignerEventsPerAddress)(nil), // 147: vega.snapshot.v1.SignerEventsPerAddress - (*ERC20MultiSigTopologyVerified)(nil), // 148: vega.snapshot.v1.ERC20MultiSigTopologyVerified - (*ERC20MultiSigTopologyPending)(nil), // 149: vega.snapshot.v1.ERC20MultiSigTopologyPending - (*EVMMultisigTopology)(nil), // 150: vega.snapshot.v1.EVMMultisigTopology - (*EVMMultisigTopologies)(nil), // 151: vega.snapshot.v1.EVMMultisigTopologies - (*ProofOfWork)(nil), // 152: vega.snapshot.v1.ProofOfWork - (*BannedParty)(nil), // 153: vega.snapshot.v1.BannedParty - (*ProofOfWorkParams)(nil), // 154: vega.snapshot.v1.ProofOfWorkParams - (*ProofOfWorkState)(nil), // 155: vega.snapshot.v1.ProofOfWorkState - (*ProofOfWorkBlockState)(nil), // 156: vega.snapshot.v1.ProofOfWorkBlockState - (*ProofOfWorkPartyStateForBlock)(nil), // 157: vega.snapshot.v1.ProofOfWorkPartyStateForBlock - (*TransactionsAtHeight)(nil), // 158: vega.snapshot.v1.TransactionsAtHeight - (*NonceRef)(nil), // 159: vega.snapshot.v1.NonceRef - (*NonceRefsAtHeight)(nil), // 160: vega.snapshot.v1.NonceRefsAtHeight - (*ProtocolUpgradeProposals)(nil), // 161: vega.snapshot.v1.ProtocolUpgradeProposals - (*AcceptedProtocolUpgradeProposal)(nil), // 162: vega.snapshot.v1.AcceptedProtocolUpgradeProposal - (*Teams)(nil), // 163: vega.snapshot.v1.Teams - (*Team)(nil), // 164: vega.snapshot.v1.Team - (*Membership)(nil), // 165: vega.snapshot.v1.Membership - (*TeamSwitches)(nil), // 166: vega.snapshot.v1.TeamSwitches - (*TeamSwitch)(nil), // 167: vega.snapshot.v1.TeamSwitch - (*Vesting)(nil), // 168: vega.snapshot.v1.Vesting - (*PartyReward)(nil), // 169: vega.snapshot.v1.PartyReward - (*ReferralProgramData)(nil), // 170: vega.snapshot.v1.ReferralProgramData - (*ReferralSet)(nil), // 171: vega.snapshot.v1.ReferralSet - (*RunningVolume)(nil), // 172: vega.snapshot.v1.RunningVolume - (*FactorByReferee)(nil), // 173: vega.snapshot.v1.FactorByReferee - (*AssetLocked)(nil), // 174: vega.snapshot.v1.AssetLocked - (*EpochBalance)(nil), // 175: vega.snapshot.v1.EpochBalance - (*InVesting)(nil), // 176: vega.snapshot.v1.InVesting - (*ActivityStreak)(nil), // 177: vega.snapshot.v1.ActivityStreak - (*PartyActivityStreak)(nil), // 178: vega.snapshot.v1.PartyActivityStreak - (*VolumeDiscountProgram)(nil), // 179: vega.snapshot.v1.VolumeDiscountProgram - (*VolumeDiscountStats)(nil), // 180: vega.snapshot.v1.VolumeDiscountStats - (*EpochPartyVolumes)(nil), // 181: vega.snapshot.v1.EpochPartyVolumes - (*PartyVolume)(nil), // 182: vega.snapshot.v1.PartyVolume - (*Liquidation)(nil), // 183: vega.snapshot.v1.Liquidation - (*PartyAssetAmount)(nil), // 184: vega.snapshot.v1.PartyAssetAmount - (*BankingTransferFeeDiscounts)(nil), // 185: vega.snapshot.v1.BankingTransferFeeDiscounts - (*CompositePriceCalculator)(nil), // 186: vega.snapshot.v1.CompositePriceCalculator - (*Parties)(nil), // 187: vega.snapshot.v1.Parties - (*PartyProfile)(nil), // 188: vega.snapshot.v1.PartyProfile - (*MarketLiquidity)(nil), // 189: vega.snapshot.v1.MarketLiquidity - (*v1.Signer)(nil), // 190: vega.data.v1.Signer - (*v1.Property)(nil), // 191: vega.data.v1.Property - (*vega.Account)(nil), // 192: vega.Account - (*vega.Asset)(nil), // 193: vega.Asset - (*vega.Withdrawal)(nil), // 194: vega.Withdrawal - (*vega.Deposit)(nil), // 195: vega.Deposit - (*v11.AssetAction)(nil), // 196: vega.checkpoint.v1.AssetAction - (*v11.RecurringTransfers)(nil), // 197: vega.checkpoint.v1.RecurringTransfers - (*v11.ScheduledTransferAtTime)(nil), // 198: vega.checkpoint.v1.ScheduledTransferAtTime - (*v11.GovernanceTransfer)(nil), // 199: vega.checkpoint.v1.GovernanceTransfer - (*v11.ScheduledGovernanceTransferAtTime)(nil), // 200: vega.checkpoint.v1.ScheduledGovernanceTransferAtTime - (*v11.BridgeState)(nil), // 201: vega.checkpoint.v1.BridgeState - (*vega.Delegation)(nil), // 202: vega.Delegation - (*vega.Proposal)(nil), // 203: vega.Proposal - (*vega.Vote)(nil), // 204: vega.Vote - (*v12.StakeLinking)(nil), // 205: vega.events.v1.StakeLinking - (*vega.StakeTotalSupply)(nil), // 206: vega.StakeTotalSupply - (*vega.Order)(nil), // 207: vega.Order - (*vega.NetworkParameter)(nil), // 208: vega.NetworkParameter - (*vega.PriceMonitoringTrigger)(nil), // 209: vega.PriceMonitoringTrigger - (vega.Market_TradingMode)(0), // 210: vega.Market.TradingMode - (vega.AuctionTrigger)(0), // 211: vega.AuctionTrigger - (*vega.AuctionDuration)(nil), // 212: vega.AuctionDuration - (*vega.Market)(nil), // 213: vega.Market - (*v12.FeesStats)(nil), // 214: vega.events.v1.FeesStats - (*v12.StopOrderEvent)(nil), // 215: vega.events.v1.StopOrderEvent - (*v11.MarketState)(nil), // 216: vega.checkpoint.v1.MarketState - (*v12.ValidatorUpdate)(nil), // 217: vega.events.v1.ValidatorUpdate - (*vega.RankingScore)(nil), // 218: vega.RankingScore - (*vega.LiquidityProvision)(nil), // 219: vega.LiquidityProvision - (*vega.LiquiditySLAParameters)(nil), // 220: vega.LiquiditySLAParameters - (*v12.PaidLiquidityFeesStats)(nil), // 221: vega.events.v1.PaidLiquidityFeesStats - (*vega.KeyValueBundle)(nil), // 222: vega.KeyValueBundle - (*v11.MarketActivityTracker)(nil), // 223: vega.checkpoint.v1.MarketActivityTracker - (*v11.TakerNotionalVolume)(nil), // 224: vega.checkpoint.v1.TakerNotionalVolume - (*v11.MarketToPartyTakerNotionalVolume)(nil), // 225: vega.checkpoint.v1.MarketToPartyTakerNotionalVolume - (*v11.EpochPartyTakerFees)(nil), // 226: vega.checkpoint.v1.EpochPartyTakerFees - (*v12.ERC20MultiSigSignerEvent)(nil), // 227: vega.events.v1.ERC20MultiSigSignerEvent - (*v12.ERC20MultiSigThresholdSetEvent)(nil), // 228: vega.events.v1.ERC20MultiSigThresholdSetEvent - (*v12.ProtocolUpgradeEvent)(nil), // 229: vega.events.v1.ProtocolUpgradeEvent - (*vega.ReferralProgram)(nil), // 230: vega.ReferralProgram - (*vega.VolumeDiscountProgram)(nil), // 231: vega.VolumeDiscountProgram - (*vega.LiquidationStrategy)(nil), // 232: vega.LiquidationStrategy - (*vega.CompositePriceConfiguration)(nil), // 233: vega.CompositePriceConfiguration - (*vega.Trade)(nil), // 234: vega.Trade - (*vega.Metadata)(nil), // 235: vega.Metadata + (Format)(0), // 0: vega.snapshot.v1.Format + (*Snapshot)(nil), // 1: vega.snapshot.v1.Snapshot + (*NodeHash)(nil), // 2: vega.snapshot.v1.NodeHash + (*Metadata)(nil), // 3: vega.snapshot.v1.Metadata + (*Chunk)(nil), // 4: vega.snapshot.v1.Chunk + (*Payload)(nil), // 5: vega.snapshot.v1.Payload + (*OrderHoldingQuantities)(nil), // 6: vega.snapshot.v1.OrderHoldingQuantities + (*HoldingAccountTracker)(nil), // 7: vega.snapshot.v1.HoldingAccountTracker + (*TimestampedTotalStake)(nil), // 8: vega.snapshot.v1.TimestampedTotalStake + (*TimestampedOpenInterest)(nil), // 9: vega.snapshot.v1.TimestampedOpenInterest + (*LiquidityTarget)(nil), // 10: vega.snapshot.v1.LiquidityTarget + (*SpotLiquidityTarget)(nil), // 11: vega.snapshot.v1.SpotLiquidityTarget + (*LiquidityOffsetProbabilityPair)(nil), // 12: vega.snapshot.v1.LiquidityOffsetProbabilityPair + (*LiquiditySupplied)(nil), // 13: vega.snapshot.v1.LiquiditySupplied + (*OracleDataBatch)(nil), // 14: vega.snapshot.v1.OracleDataBatch + (*OracleData)(nil), // 15: vega.snapshot.v1.OracleData + (*OracleDataPair)(nil), // 16: vega.snapshot.v1.OracleDataPair + (*Witness)(nil), // 17: vega.snapshot.v1.Witness + (*Resource)(nil), // 18: vega.snapshot.v1.Resource + (*EventForwarderBucket)(nil), // 19: vega.snapshot.v1.EventForwarderBucket + (*EventForwarder)(nil), // 20: vega.snapshot.v1.EventForwarder + (*CollateralAccounts)(nil), // 21: vega.snapshot.v1.CollateralAccounts + (*CollateralAssets)(nil), // 22: vega.snapshot.v1.CollateralAssets + (*ActiveAssets)(nil), // 23: vega.snapshot.v1.ActiveAssets + (*PendingAssets)(nil), // 24: vega.snapshot.v1.PendingAssets + (*PendingAssetUpdates)(nil), // 25: vega.snapshot.v1.PendingAssetUpdates + (*Withdrawal)(nil), // 26: vega.snapshot.v1.Withdrawal + (*Deposit)(nil), // 27: vega.snapshot.v1.Deposit + (*TxRef)(nil), // 28: vega.snapshot.v1.TxRef + (*BankingWithdrawals)(nil), // 29: vega.snapshot.v1.BankingWithdrawals + (*BankingDeposits)(nil), // 30: vega.snapshot.v1.BankingDeposits + (*BankingSeen)(nil), // 31: vega.snapshot.v1.BankingSeen + (*BankingAssetActions)(nil), // 32: vega.snapshot.v1.BankingAssetActions + (*BankingRecurringTransfers)(nil), // 33: vega.snapshot.v1.BankingRecurringTransfers + (*BankingScheduledTransfers)(nil), // 34: vega.snapshot.v1.BankingScheduledTransfers + (*BankingRecurringGovernanceTransfers)(nil), // 35: vega.snapshot.v1.BankingRecurringGovernanceTransfers + (*BankingScheduledGovernanceTransfers)(nil), // 36: vega.snapshot.v1.BankingScheduledGovernanceTransfers + (*BankingBridgeState)(nil), // 37: vega.snapshot.v1.BankingBridgeState + (*BankingEVMBridgeStates)(nil), // 38: vega.snapshot.v1.BankingEVMBridgeStates + (*Checkpoint)(nil), // 39: vega.snapshot.v1.Checkpoint + (*DelegationLastReconciliationTime)(nil), // 40: vega.snapshot.v1.DelegationLastReconciliationTime + (*DelegationActive)(nil), // 41: vega.snapshot.v1.DelegationActive + (*DelegationPending)(nil), // 42: vega.snapshot.v1.DelegationPending + (*DelegationAuto)(nil), // 43: vega.snapshot.v1.DelegationAuto + (*ProposalData)(nil), // 44: vega.snapshot.v1.ProposalData + (*GovernanceEnacted)(nil), // 45: vega.snapshot.v1.GovernanceEnacted + (*GovernanceActive)(nil), // 46: vega.snapshot.v1.GovernanceActive + (*BatchProposalData)(nil), // 47: vega.snapshot.v1.BatchProposalData + (*GovernanceBatchActive)(nil), // 48: vega.snapshot.v1.GovernanceBatchActive + (*GovernanceNode)(nil), // 49: vega.snapshot.v1.GovernanceNode + (*StakingAccount)(nil), // 50: vega.snapshot.v1.StakingAccount + (*StakingAccounts)(nil), // 51: vega.snapshot.v1.StakingAccounts + (*MatchingBook)(nil), // 52: vega.snapshot.v1.MatchingBook + (*NetParams)(nil), // 53: vega.snapshot.v1.NetParams + (*DecimalMap)(nil), // 54: vega.snapshot.v1.DecimalMap + (*TimePrice)(nil), // 55: vega.snapshot.v1.TimePrice + (*PriceVolume)(nil), // 56: vega.snapshot.v1.PriceVolume + (*PriceRange)(nil), // 57: vega.snapshot.v1.PriceRange + (*PriceBound)(nil), // 58: vega.snapshot.v1.PriceBound + (*PriceRangeCache)(nil), // 59: vega.snapshot.v1.PriceRangeCache + (*CurrentPrice)(nil), // 60: vega.snapshot.v1.CurrentPrice + (*PastPrice)(nil), // 61: vega.snapshot.v1.PastPrice + (*PriceMonitor)(nil), // 62: vega.snapshot.v1.PriceMonitor + (*AuctionState)(nil), // 63: vega.snapshot.v1.AuctionState + (*EquityShareLP)(nil), // 64: vega.snapshot.v1.EquityShareLP + (*EquityShare)(nil), // 65: vega.snapshot.v1.EquityShare + (*FeeSplitter)(nil), // 66: vega.snapshot.v1.FeeSplitter + (*SpotMarket)(nil), // 67: vega.snapshot.v1.SpotMarket + (*Market)(nil), // 68: vega.snapshot.v1.Market + (*PartyMarginFactor)(nil), // 69: vega.snapshot.v1.PartyMarginFactor + (*AmmState)(nil), // 70: vega.snapshot.v1.AmmState + (*PoolMapEntry)(nil), // 71: vega.snapshot.v1.PoolMapEntry + (*StringMapEntry)(nil), // 72: vega.snapshot.v1.StringMapEntry + (*Product)(nil), // 73: vega.snapshot.v1.Product + (*DataPoint)(nil), // 74: vega.snapshot.v1.DataPoint + (*AuctionIntervals)(nil), // 75: vega.snapshot.v1.AuctionIntervals + (*TWAPData)(nil), // 76: vega.snapshot.v1.TWAPData + (*Perps)(nil), // 77: vega.snapshot.v1.Perps + (*OrdersAtPrice)(nil), // 78: vega.snapshot.v1.OrdersAtPrice + (*PricedStopOrders)(nil), // 79: vega.snapshot.v1.PricedStopOrders + (*TrailingStopOrders)(nil), // 80: vega.snapshot.v1.TrailingStopOrders + (*OrdersAtOffset)(nil), // 81: vega.snapshot.v1.OrdersAtOffset + (*OffsetsAtPrice)(nil), // 82: vega.snapshot.v1.OffsetsAtPrice + (*StopOrders)(nil), // 83: vega.snapshot.v1.StopOrders + (*PeggedOrders)(nil), // 84: vega.snapshot.v1.PeggedOrders + (*SLANetworkParams)(nil), // 85: vega.snapshot.v1.SLANetworkParams + (*ExecutionMarkets)(nil), // 86: vega.snapshot.v1.ExecutionMarkets + (*Successors)(nil), // 87: vega.snapshot.v1.Successors + (*Position)(nil), // 88: vega.snapshot.v1.Position + (*MarketPositions)(nil), // 89: vega.snapshot.v1.MarketPositions + (*PartyPositionStats)(nil), // 90: vega.snapshot.v1.PartyPositionStats + (*SettlementState)(nil), // 91: vega.snapshot.v1.SettlementState + (*LastSettledPosition)(nil), // 92: vega.snapshot.v1.LastSettledPosition + (*SettlementTrade)(nil), // 93: vega.snapshot.v1.SettlementTrade + (*AppState)(nil), // 94: vega.snapshot.v1.AppState + (*EpochState)(nil), // 95: vega.snapshot.v1.EpochState + (*RewardsPendingPayouts)(nil), // 96: vega.snapshot.v1.RewardsPendingPayouts + (*ScheduledRewardsPayout)(nil), // 97: vega.snapshot.v1.ScheduledRewardsPayout + (*RewardsPayout)(nil), // 98: vega.snapshot.v1.RewardsPayout + (*RewardsPartyAmount)(nil), // 99: vega.snapshot.v1.RewardsPartyAmount + (*LimitState)(nil), // 100: vega.snapshot.v1.LimitState + (*VoteSpamPolicy)(nil), // 101: vega.snapshot.v1.VoteSpamPolicy + (*PartyProposalVoteCount)(nil), // 102: vega.snapshot.v1.PartyProposalVoteCount + (*PartyTokenBalance)(nil), // 103: vega.snapshot.v1.PartyTokenBalance + (*BlockRejectStats)(nil), // 104: vega.snapshot.v1.BlockRejectStats + (*SpamPartyTransactionCount)(nil), // 105: vega.snapshot.v1.SpamPartyTransactionCount + (*SimpleSpamPolicy)(nil), // 106: vega.snapshot.v1.SimpleSpamPolicy + (*NotarySigs)(nil), // 107: vega.snapshot.v1.NotarySigs + (*Notary)(nil), // 108: vega.snapshot.v1.Notary + (*StakeVerifierDeposited)(nil), // 109: vega.snapshot.v1.StakeVerifierDeposited + (*StakeVerifierRemoved)(nil), // 110: vega.snapshot.v1.StakeVerifierRemoved + (*StakeVerifierPending)(nil), // 111: vega.snapshot.v1.StakeVerifierPending + (*L2EthOracles)(nil), // 112: vega.snapshot.v1.L2EthOracles + (*ChainIdEthOracles)(nil), // 113: vega.snapshot.v1.ChainIdEthOracles + (*EthOracleVerifierLastBlock)(nil), // 114: vega.snapshot.v1.EthOracleVerifierLastBlock + (*EthOracleVerifierMisc)(nil), // 115: vega.snapshot.v1.EthOracleVerifierMisc + (*EthContractCallResults)(nil), // 116: vega.snapshot.v1.EthContractCallResults + (*EthContractCallResult)(nil), // 117: vega.snapshot.v1.EthContractCallResult + (*EthVerifierBucket)(nil), // 118: vega.snapshot.v1.EthVerifierBucket + (*PendingKeyRotation)(nil), // 119: vega.snapshot.v1.PendingKeyRotation + (*PendingEthereumKeyRotation)(nil), // 120: vega.snapshot.v1.PendingEthereumKeyRotation + (*Topology)(nil), // 121: vega.snapshot.v1.Topology + (*ToplogySignatures)(nil), // 122: vega.snapshot.v1.ToplogySignatures + (*PendingERC20MultisigControlSignature)(nil), // 123: vega.snapshot.v1.PendingERC20MultisigControlSignature + (*IssuedERC20MultisigControlSignature)(nil), // 124: vega.snapshot.v1.IssuedERC20MultisigControlSignature + (*ValidatorState)(nil), // 125: vega.snapshot.v1.ValidatorState + (*HeartbeatTracker)(nil), // 126: vega.snapshot.v1.HeartbeatTracker + (*PerformanceStats)(nil), // 127: vega.snapshot.v1.PerformanceStats + (*ValidatorPerformance)(nil), // 128: vega.snapshot.v1.ValidatorPerformance + (*LiquidityParameters)(nil), // 129: vega.snapshot.v1.LiquidityParameters + (*LiquidityPendingProvisions)(nil), // 130: vega.snapshot.v1.LiquidityPendingProvisions + (*LiquidityPartiesLiquidityOrders)(nil), // 131: vega.snapshot.v1.LiquidityPartiesLiquidityOrders + (*PartyOrders)(nil), // 132: vega.snapshot.v1.PartyOrders + (*LiquidityPartiesOrders)(nil), // 133: vega.snapshot.v1.LiquidityPartiesOrders + (*LiquidityProvisions)(nil), // 134: vega.snapshot.v1.LiquidityProvisions + (*LiquidityScores)(nil), // 135: vega.snapshot.v1.LiquidityScores + (*LiquidityScore)(nil), // 136: vega.snapshot.v1.LiquidityScore + (*LiquidityV2Parameters)(nil), // 137: vega.snapshot.v1.LiquidityV2Parameters + (*LiquidityV2PaidFeesStats)(nil), // 138: vega.snapshot.v1.LiquidityV2PaidFeesStats + (*LiquidityV2Provisions)(nil), // 139: vega.snapshot.v1.LiquidityV2Provisions + (*LiquidityV2PendingProvisions)(nil), // 140: vega.snapshot.v1.LiquidityV2PendingProvisions + (*LiquidityV2Performances)(nil), // 141: vega.snapshot.v1.LiquidityV2Performances + (*LiquidityV2PerformancePerParty)(nil), // 142: vega.snapshot.v1.LiquidityV2PerformancePerParty + (*LiquidityV2Scores)(nil), // 143: vega.snapshot.v1.LiquidityV2Scores + (*LiquidityV2Supplied)(nil), // 144: vega.snapshot.v1.LiquidityV2Supplied + (*FloatingPointConsensus)(nil), // 145: vega.snapshot.v1.FloatingPointConsensus + (*StateVarInternalState)(nil), // 146: vega.snapshot.v1.StateVarInternalState + (*FloatingPointValidatorResult)(nil), // 147: vega.snapshot.v1.FloatingPointValidatorResult + (*NextTimeTrigger)(nil), // 148: vega.snapshot.v1.NextTimeTrigger + (*MarketTracker)(nil), // 149: vega.snapshot.v1.MarketTracker + (*SignerEventsPerAddress)(nil), // 150: vega.snapshot.v1.SignerEventsPerAddress + (*ERC20MultiSigTopologyVerified)(nil), // 151: vega.snapshot.v1.ERC20MultiSigTopologyVerified + (*ERC20MultiSigTopologyPending)(nil), // 152: vega.snapshot.v1.ERC20MultiSigTopologyPending + (*EVMMultisigTopology)(nil), // 153: vega.snapshot.v1.EVMMultisigTopology + (*EVMMultisigTopologies)(nil), // 154: vega.snapshot.v1.EVMMultisigTopologies + (*ProofOfWork)(nil), // 155: vega.snapshot.v1.ProofOfWork + (*BannedParty)(nil), // 156: vega.snapshot.v1.BannedParty + (*ProofOfWorkParams)(nil), // 157: vega.snapshot.v1.ProofOfWorkParams + (*ProofOfWorkState)(nil), // 158: vega.snapshot.v1.ProofOfWorkState + (*ProofOfWorkBlockState)(nil), // 159: vega.snapshot.v1.ProofOfWorkBlockState + (*ProofOfWorkPartyStateForBlock)(nil), // 160: vega.snapshot.v1.ProofOfWorkPartyStateForBlock + (*TransactionsAtHeight)(nil), // 161: vega.snapshot.v1.TransactionsAtHeight + (*NonceRef)(nil), // 162: vega.snapshot.v1.NonceRef + (*NonceRefsAtHeight)(nil), // 163: vega.snapshot.v1.NonceRefsAtHeight + (*ProtocolUpgradeProposals)(nil), // 164: vega.snapshot.v1.ProtocolUpgradeProposals + (*AcceptedProtocolUpgradeProposal)(nil), // 165: vega.snapshot.v1.AcceptedProtocolUpgradeProposal + (*Teams)(nil), // 166: vega.snapshot.v1.Teams + (*Team)(nil), // 167: vega.snapshot.v1.Team + (*Membership)(nil), // 168: vega.snapshot.v1.Membership + (*TeamSwitches)(nil), // 169: vega.snapshot.v1.TeamSwitches + (*TeamSwitch)(nil), // 170: vega.snapshot.v1.TeamSwitch + (*Vesting)(nil), // 171: vega.snapshot.v1.Vesting + (*PartyReward)(nil), // 172: vega.snapshot.v1.PartyReward + (*ReferralProgramData)(nil), // 173: vega.snapshot.v1.ReferralProgramData + (*ReferralSet)(nil), // 174: vega.snapshot.v1.ReferralSet + (*RunningVolume)(nil), // 175: vega.snapshot.v1.RunningVolume + (*FactorByReferee)(nil), // 176: vega.snapshot.v1.FactorByReferee + (*AssetLocked)(nil), // 177: vega.snapshot.v1.AssetLocked + (*EpochBalance)(nil), // 178: vega.snapshot.v1.EpochBalance + (*InVesting)(nil), // 179: vega.snapshot.v1.InVesting + (*ActivityStreak)(nil), // 180: vega.snapshot.v1.ActivityStreak + (*PartyActivityStreak)(nil), // 181: vega.snapshot.v1.PartyActivityStreak + (*VolumeDiscountProgram)(nil), // 182: vega.snapshot.v1.VolumeDiscountProgram + (*VolumeDiscountStats)(nil), // 183: vega.snapshot.v1.VolumeDiscountStats + (*EpochPartyVolumes)(nil), // 184: vega.snapshot.v1.EpochPartyVolumes + (*PartyVolume)(nil), // 185: vega.snapshot.v1.PartyVolume + (*Liquidation)(nil), // 186: vega.snapshot.v1.Liquidation + (*PartyAssetAmount)(nil), // 187: vega.snapshot.v1.PartyAssetAmount + (*BankingTransferFeeDiscounts)(nil), // 188: vega.snapshot.v1.BankingTransferFeeDiscounts + (*CompositePriceCalculator)(nil), // 189: vega.snapshot.v1.CompositePriceCalculator + (*Parties)(nil), // 190: vega.snapshot.v1.Parties + (*PartyProfile)(nil), // 191: vega.snapshot.v1.PartyProfile + (*AMMValues)(nil), // 192: vega.snapshot.v1.AMMValues + (*MarketLiquidity)(nil), // 193: vega.snapshot.v1.MarketLiquidity + (*PoolMapEntry_Curve)(nil), // 194: vega.snapshot.v1.PoolMapEntry.Curve + (*PoolMapEntry_Pool)(nil), // 195: vega.snapshot.v1.PoolMapEntry.Pool + (*v1.Signer)(nil), // 196: vega.data.v1.Signer + (*v1.Property)(nil), // 197: vega.data.v1.Property + (*vega.Account)(nil), // 198: vega.Account + (*vega.Asset)(nil), // 199: vega.Asset + (*vega.Withdrawal)(nil), // 200: vega.Withdrawal + (*vega.Deposit)(nil), // 201: vega.Deposit + (*v11.AssetAction)(nil), // 202: vega.checkpoint.v1.AssetAction + (*v11.RecurringTransfers)(nil), // 203: vega.checkpoint.v1.RecurringTransfers + (*v11.ScheduledTransferAtTime)(nil), // 204: vega.checkpoint.v1.ScheduledTransferAtTime + (*v11.GovernanceTransfer)(nil), // 205: vega.checkpoint.v1.GovernanceTransfer + (*v11.ScheduledGovernanceTransferAtTime)(nil), // 206: vega.checkpoint.v1.ScheduledGovernanceTransferAtTime + (*v11.BridgeState)(nil), // 207: vega.checkpoint.v1.BridgeState + (*vega.Delegation)(nil), // 208: vega.Delegation + (*vega.Proposal)(nil), // 209: vega.Proposal + (*vega.Vote)(nil), // 210: vega.Vote + (*v12.StakeLinking)(nil), // 211: vega.events.v1.StakeLinking + (*vega.StakeTotalSupply)(nil), // 212: vega.StakeTotalSupply + (*vega.Order)(nil), // 213: vega.Order + (*vega.NetworkParameter)(nil), // 214: vega.NetworkParameter + (*vega.PriceMonitoringTrigger)(nil), // 215: vega.PriceMonitoringTrigger + (vega.Market_TradingMode)(0), // 216: vega.Market.TradingMode + (vega.AuctionTrigger)(0), // 217: vega.AuctionTrigger + (*vega.AuctionDuration)(nil), // 218: vega.AuctionDuration + (*vega.Market)(nil), // 219: vega.Market + (*v12.FeesStats)(nil), // 220: vega.events.v1.FeesStats + (*v12.StopOrderEvent)(nil), // 221: vega.events.v1.StopOrderEvent + (*v11.MarketState)(nil), // 222: vega.checkpoint.v1.MarketState + (*v12.ValidatorUpdate)(nil), // 223: vega.events.v1.ValidatorUpdate + (*vega.RankingScore)(nil), // 224: vega.RankingScore + (*vega.LiquidityProvision)(nil), // 225: vega.LiquidityProvision + (*vega.LiquiditySLAParameters)(nil), // 226: vega.LiquiditySLAParameters + (*v12.PaidLiquidityFeesStats)(nil), // 227: vega.events.v1.PaidLiquidityFeesStats + (*vega.KeyValueBundle)(nil), // 228: vega.KeyValueBundle + (*v11.MarketActivityTracker)(nil), // 229: vega.checkpoint.v1.MarketActivityTracker + (*v11.TakerNotionalVolume)(nil), // 230: vega.checkpoint.v1.TakerNotionalVolume + (*v11.MarketToPartyTakerNotionalVolume)(nil), // 231: vega.checkpoint.v1.MarketToPartyTakerNotionalVolume + (*v11.EpochPartyTakerFees)(nil), // 232: vega.checkpoint.v1.EpochPartyTakerFees + (*v12.ERC20MultiSigSignerEvent)(nil), // 233: vega.events.v1.ERC20MultiSigSignerEvent + (*v12.ERC20MultiSigThresholdSetEvent)(nil), // 234: vega.events.v1.ERC20MultiSigThresholdSetEvent + (*v12.ProtocolUpgradeEvent)(nil), // 235: vega.events.v1.ProtocolUpgradeEvent + (*vega.ReferralProgram)(nil), // 236: vega.ReferralProgram + (*vega.VolumeDiscountProgram)(nil), // 237: vega.VolumeDiscountProgram + (*vega.LiquidationStrategy)(nil), // 238: vega.LiquidationStrategy + (*vega.CompositePriceConfiguration)(nil), // 239: vega.CompositePriceConfiguration + (*vega.Trade)(nil), // 240: vega.Trade + (*vega.Metadata)(nil), // 241: vega.Metadata + (*v12.AMMPool_ConcentratedLiquidityParameters)(nil), // 242: vega.events.v1.AMMPool.ConcentratedLiquidityParameters + (v12.AMMPool_Status)(0), // 243: vega.events.v1.AMMPool.Status } var file_vega_snapshot_v1_snapshot_proto_depIdxs = []int32{ 0, // 0: vega.snapshot.v1.Snapshot.format:type_name -> vega.snapshot.v1.Format @@ -16673,69 +17216,69 @@ var file_vega_snapshot_v1_snapshot_proto_depIdxs = []int32{ 51, // 17: vega.snapshot.v1.Payload.staking_accounts:type_name -> vega.snapshot.v1.StakingAccounts 52, // 18: vega.snapshot.v1.Payload.matching_book:type_name -> vega.snapshot.v1.MatchingBook 53, // 19: vega.snapshot.v1.Payload.network_parameters:type_name -> vega.snapshot.v1.NetParams - 83, // 20: vega.snapshot.v1.Payload.execution_markets:type_name -> vega.snapshot.v1.ExecutionMarkets - 86, // 21: vega.snapshot.v1.Payload.market_positions:type_name -> vega.snapshot.v1.MarketPositions - 91, // 22: vega.snapshot.v1.Payload.app_state:type_name -> vega.snapshot.v1.AppState - 92, // 23: vega.snapshot.v1.Payload.epoch:type_name -> vega.snapshot.v1.EpochState - 93, // 24: vega.snapshot.v1.Payload.rewards_pending_payouts:type_name -> vega.snapshot.v1.RewardsPendingPayouts + 86, // 20: vega.snapshot.v1.Payload.execution_markets:type_name -> vega.snapshot.v1.ExecutionMarkets + 89, // 21: vega.snapshot.v1.Payload.market_positions:type_name -> vega.snapshot.v1.MarketPositions + 94, // 22: vega.snapshot.v1.Payload.app_state:type_name -> vega.snapshot.v1.AppState + 95, // 23: vega.snapshot.v1.Payload.epoch:type_name -> vega.snapshot.v1.EpochState + 96, // 24: vega.snapshot.v1.Payload.rewards_pending_payouts:type_name -> vega.snapshot.v1.RewardsPendingPayouts 49, // 25: vega.snapshot.v1.Payload.governance_node:type_name -> vega.snapshot.v1.GovernanceNode - 97, // 26: vega.snapshot.v1.Payload.limit_state:type_name -> vega.snapshot.v1.LimitState - 98, // 27: vega.snapshot.v1.Payload.vote_spam_policy:type_name -> vega.snapshot.v1.VoteSpamPolicy - 103, // 28: vega.snapshot.v1.Payload.simple_spam_policy:type_name -> vega.snapshot.v1.SimpleSpamPolicy - 105, // 29: vega.snapshot.v1.Payload.notary:type_name -> vega.snapshot.v1.Notary + 100, // 26: vega.snapshot.v1.Payload.limit_state:type_name -> vega.snapshot.v1.LimitState + 101, // 27: vega.snapshot.v1.Payload.vote_spam_policy:type_name -> vega.snapshot.v1.VoteSpamPolicy + 106, // 28: vega.snapshot.v1.Payload.simple_spam_policy:type_name -> vega.snapshot.v1.SimpleSpamPolicy + 108, // 29: vega.snapshot.v1.Payload.notary:type_name -> vega.snapshot.v1.Notary 20, // 30: vega.snapshot.v1.Payload.event_forwarder:type_name -> vega.snapshot.v1.EventForwarder - 106, // 31: vega.snapshot.v1.Payload.stake_verifier_deposited:type_name -> vega.snapshot.v1.StakeVerifierDeposited - 107, // 32: vega.snapshot.v1.Payload.stake_verifier_removed:type_name -> vega.snapshot.v1.StakeVerifierRemoved + 109, // 31: vega.snapshot.v1.Payload.stake_verifier_deposited:type_name -> vega.snapshot.v1.StakeVerifierDeposited + 110, // 32: vega.snapshot.v1.Payload.stake_verifier_removed:type_name -> vega.snapshot.v1.StakeVerifierRemoved 17, // 33: vega.snapshot.v1.Payload.witness:type_name -> vega.snapshot.v1.Witness 40, // 34: vega.snapshot.v1.Payload.delegation_last_reconciliation_time:type_name -> vega.snapshot.v1.DelegationLastReconciliationTime - 118, // 35: vega.snapshot.v1.Payload.topology:type_name -> vega.snapshot.v1.Topology + 121, // 35: vega.snapshot.v1.Payload.topology:type_name -> vega.snapshot.v1.Topology 14, // 36: vega.snapshot.v1.Payload.oracle_data:type_name -> vega.snapshot.v1.OracleDataBatch - 126, // 37: vega.snapshot.v1.Payload.liquidity_parameters:type_name -> vega.snapshot.v1.LiquidityParameters - 127, // 38: vega.snapshot.v1.Payload.liquidity_pending_provisions:type_name -> vega.snapshot.v1.LiquidityPendingProvisions - 128, // 39: vega.snapshot.v1.Payload.liquidity_parties_liquidity_orders:type_name -> vega.snapshot.v1.LiquidityPartiesLiquidityOrders - 130, // 40: vega.snapshot.v1.Payload.liquidity_parties_orders:type_name -> vega.snapshot.v1.LiquidityPartiesOrders - 131, // 41: vega.snapshot.v1.Payload.liquidity_provisions:type_name -> vega.snapshot.v1.LiquidityProvisions + 129, // 37: vega.snapshot.v1.Payload.liquidity_parameters:type_name -> vega.snapshot.v1.LiquidityParameters + 130, // 38: vega.snapshot.v1.Payload.liquidity_pending_provisions:type_name -> vega.snapshot.v1.LiquidityPendingProvisions + 131, // 39: vega.snapshot.v1.Payload.liquidity_parties_liquidity_orders:type_name -> vega.snapshot.v1.LiquidityPartiesLiquidityOrders + 133, // 40: vega.snapshot.v1.Payload.liquidity_parties_orders:type_name -> vega.snapshot.v1.LiquidityPartiesOrders + 134, // 41: vega.snapshot.v1.Payload.liquidity_provisions:type_name -> vega.snapshot.v1.LiquidityProvisions 13, // 42: vega.snapshot.v1.Payload.liquidity_supplied:type_name -> vega.snapshot.v1.LiquiditySupplied 10, // 43: vega.snapshot.v1.Payload.liquidity_target:type_name -> vega.snapshot.v1.LiquidityTarget - 142, // 44: vega.snapshot.v1.Payload.floating_point_consensus:type_name -> vega.snapshot.v1.FloatingPointConsensus - 146, // 45: vega.snapshot.v1.Payload.market_tracker:type_name -> vega.snapshot.v1.MarketTracker + 145, // 44: vega.snapshot.v1.Payload.floating_point_consensus:type_name -> vega.snapshot.v1.FloatingPointConsensus + 149, // 45: vega.snapshot.v1.Payload.market_tracker:type_name -> vega.snapshot.v1.MarketTracker 33, // 46: vega.snapshot.v1.Payload.banking_recurring_transfers:type_name -> vega.snapshot.v1.BankingRecurringTransfers 34, // 47: vega.snapshot.v1.Payload.banking_scheduled_transfers:type_name -> vega.snapshot.v1.BankingScheduledTransfers - 148, // 48: vega.snapshot.v1.Payload.erc20_multisig_topology_verified:type_name -> vega.snapshot.v1.ERC20MultiSigTopologyVerified - 149, // 49: vega.snapshot.v1.Payload.erc20_multisig_topology_pending:type_name -> vega.snapshot.v1.ERC20MultiSigTopologyPending - 152, // 50: vega.snapshot.v1.Payload.proof_of_work:type_name -> vega.snapshot.v1.ProofOfWork + 151, // 48: vega.snapshot.v1.Payload.erc20_multisig_topology_verified:type_name -> vega.snapshot.v1.ERC20MultiSigTopologyVerified + 152, // 49: vega.snapshot.v1.Payload.erc20_multisig_topology_pending:type_name -> vega.snapshot.v1.ERC20MultiSigTopologyPending + 155, // 50: vega.snapshot.v1.Payload.proof_of_work:type_name -> vega.snapshot.v1.ProofOfWork 25, // 51: vega.snapshot.v1.Payload.pending_asset_updates:type_name -> vega.snapshot.v1.PendingAssetUpdates - 161, // 52: vega.snapshot.v1.Payload.protocol_upgrade_proposals:type_name -> vega.snapshot.v1.ProtocolUpgradeProposals + 164, // 52: vega.snapshot.v1.Payload.protocol_upgrade_proposals:type_name -> vega.snapshot.v1.ProtocolUpgradeProposals 37, // 53: vega.snapshot.v1.Payload.banking_primary_bridge_state:type_name -> vega.snapshot.v1.BankingBridgeState - 88, // 54: vega.snapshot.v1.Payload.settlement_state:type_name -> vega.snapshot.v1.SettlementState - 132, // 55: vega.snapshot.v1.Payload.liquidity_scores:type_name -> vega.snapshot.v1.LiquidityScores + 91, // 54: vega.snapshot.v1.Payload.settlement_state:type_name -> vega.snapshot.v1.SettlementState + 135, // 55: vega.snapshot.v1.Payload.liquidity_scores:type_name -> vega.snapshot.v1.LiquidityScores 11, // 56: vega.snapshot.v1.Payload.spot_liquidity_target:type_name -> vega.snapshot.v1.SpotLiquidityTarget 35, // 57: vega.snapshot.v1.Payload.banking_recurring_governance_transfers:type_name -> vega.snapshot.v1.BankingRecurringGovernanceTransfers 36, // 58: vega.snapshot.v1.Payload.banking_scheduled_governance_transfers:type_name -> vega.snapshot.v1.BankingScheduledGovernanceTransfers - 113, // 59: vega.snapshot.v1.Payload.eth_contract_call_results:type_name -> vega.snapshot.v1.EthContractCallResults - 111, // 60: vega.snapshot.v1.Payload.eth_oracle_verifier_last_block:type_name -> vega.snapshot.v1.EthOracleVerifierLastBlock - 136, // 61: vega.snapshot.v1.Payload.liquidity_v2_provisions:type_name -> vega.snapshot.v1.LiquidityV2Provisions - 137, // 62: vega.snapshot.v1.Payload.liquidity_v2_pending_provisions:type_name -> vega.snapshot.v1.LiquidityV2PendingProvisions - 138, // 63: vega.snapshot.v1.Payload.liquidity_v2_performances:type_name -> vega.snapshot.v1.LiquidityV2Performances - 141, // 64: vega.snapshot.v1.Payload.liquidity_v2_supplied:type_name -> vega.snapshot.v1.LiquidityV2Supplied - 140, // 65: vega.snapshot.v1.Payload.liquidity_v2_scores:type_name -> vega.snapshot.v1.LiquidityV2Scores + 116, // 59: vega.snapshot.v1.Payload.eth_contract_call_results:type_name -> vega.snapshot.v1.EthContractCallResults + 114, // 60: vega.snapshot.v1.Payload.eth_oracle_verifier_last_block:type_name -> vega.snapshot.v1.EthOracleVerifierLastBlock + 139, // 61: vega.snapshot.v1.Payload.liquidity_v2_provisions:type_name -> vega.snapshot.v1.LiquidityV2Provisions + 140, // 62: vega.snapshot.v1.Payload.liquidity_v2_pending_provisions:type_name -> vega.snapshot.v1.LiquidityV2PendingProvisions + 141, // 63: vega.snapshot.v1.Payload.liquidity_v2_performances:type_name -> vega.snapshot.v1.LiquidityV2Performances + 144, // 64: vega.snapshot.v1.Payload.liquidity_v2_supplied:type_name -> vega.snapshot.v1.LiquidityV2Supplied + 143, // 65: vega.snapshot.v1.Payload.liquidity_v2_scores:type_name -> vega.snapshot.v1.LiquidityV2Scores 7, // 66: vega.snapshot.v1.Payload.holding_account_tracker:type_name -> vega.snapshot.v1.HoldingAccountTracker - 163, // 67: vega.snapshot.v1.Payload.teams:type_name -> vega.snapshot.v1.Teams - 166, // 68: vega.snapshot.v1.Payload.team_switches:type_name -> vega.snapshot.v1.TeamSwitches - 168, // 69: vega.snapshot.v1.Payload.vesting:type_name -> vega.snapshot.v1.Vesting - 170, // 70: vega.snapshot.v1.Payload.referral_program:type_name -> vega.snapshot.v1.ReferralProgramData - 177, // 71: vega.snapshot.v1.Payload.activity_streak:type_name -> vega.snapshot.v1.ActivityStreak - 179, // 72: vega.snapshot.v1.Payload.volume_discount_program:type_name -> vega.snapshot.v1.VolumeDiscountProgram - 134, // 73: vega.snapshot.v1.Payload.liquidity_v2_parameters:type_name -> vega.snapshot.v1.LiquidityV2Parameters - 135, // 74: vega.snapshot.v1.Payload.liquidity_v2_paid_fees_stats:type_name -> vega.snapshot.v1.LiquidityV2PaidFeesStats - 183, // 75: vega.snapshot.v1.Payload.liquidation:type_name -> vega.snapshot.v1.Liquidation - 185, // 76: vega.snapshot.v1.Payload.banking_transfer_fee_discounts:type_name -> vega.snapshot.v1.BankingTransferFeeDiscounts + 166, // 67: vega.snapshot.v1.Payload.teams:type_name -> vega.snapshot.v1.Teams + 169, // 68: vega.snapshot.v1.Payload.team_switches:type_name -> vega.snapshot.v1.TeamSwitches + 171, // 69: vega.snapshot.v1.Payload.vesting:type_name -> vega.snapshot.v1.Vesting + 173, // 70: vega.snapshot.v1.Payload.referral_program:type_name -> vega.snapshot.v1.ReferralProgramData + 180, // 71: vega.snapshot.v1.Payload.activity_streak:type_name -> vega.snapshot.v1.ActivityStreak + 182, // 72: vega.snapshot.v1.Payload.volume_discount_program:type_name -> vega.snapshot.v1.VolumeDiscountProgram + 137, // 73: vega.snapshot.v1.Payload.liquidity_v2_parameters:type_name -> vega.snapshot.v1.LiquidityV2Parameters + 138, // 74: vega.snapshot.v1.Payload.liquidity_v2_paid_fees_stats:type_name -> vega.snapshot.v1.LiquidityV2PaidFeesStats + 186, // 75: vega.snapshot.v1.Payload.liquidation:type_name -> vega.snapshot.v1.Liquidation + 188, // 76: vega.snapshot.v1.Payload.banking_transfer_fee_discounts:type_name -> vega.snapshot.v1.BankingTransferFeeDiscounts 48, // 77: vega.snapshot.v1.Payload.governance_batch_active:type_name -> vega.snapshot.v1.GovernanceBatchActive - 187, // 78: vega.snapshot.v1.Payload.parties:type_name -> vega.snapshot.v1.Parties - 109, // 79: vega.snapshot.v1.Payload.l2_eth_oracles:type_name -> vega.snapshot.v1.L2EthOracles - 112, // 80: vega.snapshot.v1.Payload.eth_oracle_verifier_misc:type_name -> vega.snapshot.v1.EthOracleVerifierMisc + 190, // 78: vega.snapshot.v1.Payload.parties:type_name -> vega.snapshot.v1.Parties + 112, // 79: vega.snapshot.v1.Payload.l2_eth_oracles:type_name -> vega.snapshot.v1.L2EthOracles + 115, // 80: vega.snapshot.v1.Payload.eth_oracle_verifier_misc:type_name -> vega.snapshot.v1.EthOracleVerifierMisc 38, // 81: vega.snapshot.v1.Payload.banking_evm_bridge_states:type_name -> vega.snapshot.v1.BankingEVMBridgeStates - 151, // 82: vega.snapshot.v1.Payload.evm_multisig_topologies:type_name -> vega.snapshot.v1.EVMMultisigTopologies + 154, // 82: vega.snapshot.v1.Payload.evm_multisig_topologies:type_name -> vega.snapshot.v1.EVMMultisigTopologies 6, // 83: vega.snapshot.v1.HoldingAccountTracker.order_holding:type_name -> vega.snapshot.v1.OrderHoldingQuantities 9, // 84: vega.snapshot.v1.LiquidityTarget.previous_open_interests:type_name -> vega.snapshot.v1.TimestampedOpenInterest 9, // 85: vega.snapshot.v1.LiquidityTarget.max_open_interests:type_name -> vega.snapshot.v1.TimestampedOpenInterest @@ -16744,49 +17287,49 @@ var file_vega_snapshot_v1_snapshot_proto_depIdxs = []int32{ 12, // 88: vega.snapshot.v1.LiquiditySupplied.bid_cache:type_name -> vega.snapshot.v1.LiquidityOffsetProbabilityPair 12, // 89: vega.snapshot.v1.LiquiditySupplied.ask_cache:type_name -> vega.snapshot.v1.LiquidityOffsetProbabilityPair 15, // 90: vega.snapshot.v1.OracleDataBatch.oracle_data:type_name -> vega.snapshot.v1.OracleData - 190, // 91: vega.snapshot.v1.OracleData.signers:type_name -> vega.data.v1.Signer + 196, // 91: vega.snapshot.v1.OracleData.signers:type_name -> vega.data.v1.Signer 16, // 92: vega.snapshot.v1.OracleData.data:type_name -> vega.snapshot.v1.OracleDataPair - 191, // 93: vega.snapshot.v1.OracleData.meta_data:type_name -> vega.data.v1.Property + 197, // 93: vega.snapshot.v1.OracleData.meta_data:type_name -> vega.data.v1.Property 18, // 94: vega.snapshot.v1.Witness.resources:type_name -> vega.snapshot.v1.Resource 19, // 95: vega.snapshot.v1.EventForwarder.buckets:type_name -> vega.snapshot.v1.EventForwarderBucket - 192, // 96: vega.snapshot.v1.CollateralAccounts.accounts:type_name -> vega.Account - 193, // 97: vega.snapshot.v1.CollateralAssets.assets:type_name -> vega.Asset - 193, // 98: vega.snapshot.v1.ActiveAssets.assets:type_name -> vega.Asset - 193, // 99: vega.snapshot.v1.PendingAssets.assets:type_name -> vega.Asset - 193, // 100: vega.snapshot.v1.PendingAssetUpdates.assets:type_name -> vega.Asset - 194, // 101: vega.snapshot.v1.Withdrawal.withdrawal:type_name -> vega.Withdrawal - 195, // 102: vega.snapshot.v1.Deposit.deposit:type_name -> vega.Deposit + 198, // 96: vega.snapshot.v1.CollateralAccounts.accounts:type_name -> vega.Account + 199, // 97: vega.snapshot.v1.CollateralAssets.assets:type_name -> vega.Asset + 199, // 98: vega.snapshot.v1.ActiveAssets.assets:type_name -> vega.Asset + 199, // 99: vega.snapshot.v1.PendingAssets.assets:type_name -> vega.Asset + 199, // 100: vega.snapshot.v1.PendingAssetUpdates.assets:type_name -> vega.Asset + 200, // 101: vega.snapshot.v1.Withdrawal.withdrawal:type_name -> vega.Withdrawal + 201, // 102: vega.snapshot.v1.Deposit.deposit:type_name -> vega.Deposit 26, // 103: vega.snapshot.v1.BankingWithdrawals.withdrawals:type_name -> vega.snapshot.v1.Withdrawal 27, // 104: vega.snapshot.v1.BankingDeposits.deposit:type_name -> vega.snapshot.v1.Deposit - 196, // 105: vega.snapshot.v1.BankingAssetActions.asset_action:type_name -> vega.checkpoint.v1.AssetAction - 197, // 106: vega.snapshot.v1.BankingRecurringTransfers.recurring_transfers:type_name -> vega.checkpoint.v1.RecurringTransfers - 198, // 107: vega.snapshot.v1.BankingScheduledTransfers.transfers_at_time:type_name -> vega.checkpoint.v1.ScheduledTransferAtTime - 199, // 108: vega.snapshot.v1.BankingRecurringGovernanceTransfers.recurring_transfers:type_name -> vega.checkpoint.v1.GovernanceTransfer - 200, // 109: vega.snapshot.v1.BankingScheduledGovernanceTransfers.transfers_at_time:type_name -> vega.checkpoint.v1.ScheduledGovernanceTransferAtTime - 201, // 110: vega.snapshot.v1.BankingBridgeState.bridge_state:type_name -> vega.checkpoint.v1.BridgeState - 201, // 111: vega.snapshot.v1.BankingEVMBridgeStates.bridge_states:type_name -> vega.checkpoint.v1.BridgeState - 202, // 112: vega.snapshot.v1.DelegationActive.delegations:type_name -> vega.Delegation - 202, // 113: vega.snapshot.v1.DelegationPending.delegations:type_name -> vega.Delegation - 202, // 114: vega.snapshot.v1.DelegationPending.undelegation:type_name -> vega.Delegation - 203, // 115: vega.snapshot.v1.ProposalData.proposal:type_name -> vega.Proposal - 204, // 116: vega.snapshot.v1.ProposalData.yes:type_name -> vega.Vote - 204, // 117: vega.snapshot.v1.ProposalData.no:type_name -> vega.Vote - 204, // 118: vega.snapshot.v1.ProposalData.invalid:type_name -> vega.Vote + 202, // 105: vega.snapshot.v1.BankingAssetActions.asset_action:type_name -> vega.checkpoint.v1.AssetAction + 203, // 106: vega.snapshot.v1.BankingRecurringTransfers.recurring_transfers:type_name -> vega.checkpoint.v1.RecurringTransfers + 204, // 107: vega.snapshot.v1.BankingScheduledTransfers.transfers_at_time:type_name -> vega.checkpoint.v1.ScheduledTransferAtTime + 205, // 108: vega.snapshot.v1.BankingRecurringGovernanceTransfers.recurring_transfers:type_name -> vega.checkpoint.v1.GovernanceTransfer + 206, // 109: vega.snapshot.v1.BankingScheduledGovernanceTransfers.transfers_at_time:type_name -> vega.checkpoint.v1.ScheduledGovernanceTransferAtTime + 207, // 110: vega.snapshot.v1.BankingBridgeState.bridge_state:type_name -> vega.checkpoint.v1.BridgeState + 207, // 111: vega.snapshot.v1.BankingEVMBridgeStates.bridge_states:type_name -> vega.checkpoint.v1.BridgeState + 208, // 112: vega.snapshot.v1.DelegationActive.delegations:type_name -> vega.Delegation + 208, // 113: vega.snapshot.v1.DelegationPending.delegations:type_name -> vega.Delegation + 208, // 114: vega.snapshot.v1.DelegationPending.undelegation:type_name -> vega.Delegation + 209, // 115: vega.snapshot.v1.ProposalData.proposal:type_name -> vega.Proposal + 210, // 116: vega.snapshot.v1.ProposalData.yes:type_name -> vega.Vote + 210, // 117: vega.snapshot.v1.ProposalData.no:type_name -> vega.Vote + 210, // 118: vega.snapshot.v1.ProposalData.invalid:type_name -> vega.Vote 44, // 119: vega.snapshot.v1.GovernanceEnacted.proposals:type_name -> vega.snapshot.v1.ProposalData 44, // 120: vega.snapshot.v1.GovernanceActive.proposals:type_name -> vega.snapshot.v1.ProposalData 44, // 121: vega.snapshot.v1.BatchProposalData.batch_proposal:type_name -> vega.snapshot.v1.ProposalData - 203, // 122: vega.snapshot.v1.BatchProposalData.proposals:type_name -> vega.Proposal + 209, // 122: vega.snapshot.v1.BatchProposalData.proposals:type_name -> vega.Proposal 47, // 123: vega.snapshot.v1.GovernanceBatchActive.batch_proposals:type_name -> vega.snapshot.v1.BatchProposalData - 203, // 124: vega.snapshot.v1.GovernanceNode.proposals:type_name -> vega.Proposal + 209, // 124: vega.snapshot.v1.GovernanceNode.proposals:type_name -> vega.Proposal 44, // 125: vega.snapshot.v1.GovernanceNode.proposal_data:type_name -> vega.snapshot.v1.ProposalData 47, // 126: vega.snapshot.v1.GovernanceNode.batch_proposal_data:type_name -> vega.snapshot.v1.BatchProposalData - 205, // 127: vega.snapshot.v1.StakingAccount.events:type_name -> vega.events.v1.StakeLinking + 211, // 127: vega.snapshot.v1.StakingAccount.events:type_name -> vega.events.v1.StakeLinking 50, // 128: vega.snapshot.v1.StakingAccounts.accounts:type_name -> vega.snapshot.v1.StakingAccount - 206, // 129: vega.snapshot.v1.StakingAccounts.pending_stake_total_supply:type_name -> vega.StakeTotalSupply - 207, // 130: vega.snapshot.v1.MatchingBook.buy:type_name -> vega.Order - 207, // 131: vega.snapshot.v1.MatchingBook.sell:type_name -> vega.Order - 208, // 132: vega.snapshot.v1.NetParams.params:type_name -> vega.NetworkParameter - 209, // 133: vega.snapshot.v1.PriceBound.trigger:type_name -> vega.PriceMonitoringTrigger + 212, // 129: vega.snapshot.v1.StakingAccounts.pending_stake_total_supply:type_name -> vega.StakeTotalSupply + 213, // 130: vega.snapshot.v1.MatchingBook.buy:type_name -> vega.Order + 213, // 131: vega.snapshot.v1.MatchingBook.sell:type_name -> vega.Order + 214, // 132: vega.snapshot.v1.NetParams.params:type_name -> vega.NetworkParameter + 215, // 133: vega.snapshot.v1.PriceBound.trigger:type_name -> vega.PriceMonitoringTrigger 58, // 134: vega.snapshot.v1.PriceRangeCache.bound:type_name -> vega.snapshot.v1.PriceBound 57, // 135: vega.snapshot.v1.PriceRangeCache.range:type_name -> vega.snapshot.v1.PriceRange 54, // 136: vega.snapshot.v1.PriceMonitor.fp_horizons:type_name -> vega.snapshot.v1.DecimalMap @@ -16795,168 +17338,178 @@ var file_vega_snapshot_v1_snapshot_proto_depIdxs = []int32{ 54, // 139: vega.snapshot.v1.PriceMonitor.ref_price_cache:type_name -> vega.snapshot.v1.DecimalMap 60, // 140: vega.snapshot.v1.PriceMonitor.prices_now:type_name -> vega.snapshot.v1.CurrentPrice 61, // 141: vega.snapshot.v1.PriceMonitor.prices_past:type_name -> vega.snapshot.v1.PastPrice - 210, // 142: vega.snapshot.v1.AuctionState.mode:type_name -> vega.Market.TradingMode - 210, // 143: vega.snapshot.v1.AuctionState.default_mode:type_name -> vega.Market.TradingMode - 211, // 144: vega.snapshot.v1.AuctionState.trigger:type_name -> vega.AuctionTrigger - 212, // 145: vega.snapshot.v1.AuctionState.end:type_name -> vega.AuctionDuration - 211, // 146: vega.snapshot.v1.AuctionState.extension:type_name -> vega.AuctionTrigger + 216, // 142: vega.snapshot.v1.AuctionState.mode:type_name -> vega.Market.TradingMode + 216, // 143: vega.snapshot.v1.AuctionState.default_mode:type_name -> vega.Market.TradingMode + 217, // 144: vega.snapshot.v1.AuctionState.trigger:type_name -> vega.AuctionTrigger + 218, // 145: vega.snapshot.v1.AuctionState.end:type_name -> vega.AuctionDuration + 217, // 146: vega.snapshot.v1.AuctionState.extension:type_name -> vega.AuctionTrigger 64, // 147: vega.snapshot.v1.EquityShare.lps:type_name -> vega.snapshot.v1.EquityShareLP - 213, // 148: vega.snapshot.v1.SpotMarket.market:type_name -> vega.Market + 219, // 148: vega.snapshot.v1.SpotMarket.market:type_name -> vega.Market 62, // 149: vega.snapshot.v1.SpotMarket.price_monitor:type_name -> vega.snapshot.v1.PriceMonitor 63, // 150: vega.snapshot.v1.SpotMarket.auction_state:type_name -> vega.snapshot.v1.AuctionState - 81, // 151: vega.snapshot.v1.SpotMarket.pegged_orders:type_name -> vega.snapshot.v1.PeggedOrders - 207, // 152: vega.snapshot.v1.SpotMarket.expiring_orders:type_name -> vega.Order + 84, // 151: vega.snapshot.v1.SpotMarket.pegged_orders:type_name -> vega.snapshot.v1.PeggedOrders + 213, // 152: vega.snapshot.v1.SpotMarket.expiring_orders:type_name -> vega.Order 65, // 153: vega.snapshot.v1.SpotMarket.equity_share:type_name -> vega.snapshot.v1.EquityShare 66, // 154: vega.snapshot.v1.SpotMarket.fee_splitter:type_name -> vega.snapshot.v1.FeeSplitter - 80, // 155: vega.snapshot.v1.SpotMarket.stop_orders:type_name -> vega.snapshot.v1.StopOrders - 207, // 156: vega.snapshot.v1.SpotMarket.expiring_stop_orders:type_name -> vega.Order - 214, // 157: vega.snapshot.v1.SpotMarket.fees_stats:type_name -> vega.events.v1.FeesStats - 189, // 158: vega.snapshot.v1.SpotMarket.market_liquidity:type_name -> vega.snapshot.v1.MarketLiquidity - 213, // 159: vega.snapshot.v1.Market.market:type_name -> vega.Market + 83, // 155: vega.snapshot.v1.SpotMarket.stop_orders:type_name -> vega.snapshot.v1.StopOrders + 213, // 156: vega.snapshot.v1.SpotMarket.expiring_stop_orders:type_name -> vega.Order + 220, // 157: vega.snapshot.v1.SpotMarket.fees_stats:type_name -> vega.events.v1.FeesStats + 193, // 158: vega.snapshot.v1.SpotMarket.market_liquidity:type_name -> vega.snapshot.v1.MarketLiquidity + 219, // 159: vega.snapshot.v1.Market.market:type_name -> vega.Market 62, // 160: vega.snapshot.v1.Market.price_monitor:type_name -> vega.snapshot.v1.PriceMonitor 63, // 161: vega.snapshot.v1.Market.auction_state:type_name -> vega.snapshot.v1.AuctionState - 81, // 162: vega.snapshot.v1.Market.pegged_orders:type_name -> vega.snapshot.v1.PeggedOrders - 207, // 163: vega.snapshot.v1.Market.expiring_orders:type_name -> vega.Order + 84, // 162: vega.snapshot.v1.Market.pegged_orders:type_name -> vega.snapshot.v1.PeggedOrders + 213, // 163: vega.snapshot.v1.Market.expiring_orders:type_name -> vega.Order 65, // 164: vega.snapshot.v1.Market.equity_share:type_name -> vega.snapshot.v1.EquityShare 66, // 165: vega.snapshot.v1.Market.fee_splitter:type_name -> vega.snapshot.v1.FeeSplitter - 80, // 166: vega.snapshot.v1.Market.stop_orders:type_name -> vega.snapshot.v1.StopOrders - 207, // 167: vega.snapshot.v1.Market.expiring_stop_orders:type_name -> vega.Order - 70, // 168: vega.snapshot.v1.Market.product:type_name -> vega.snapshot.v1.Product - 214, // 169: vega.snapshot.v1.Market.fees_stats:type_name -> vega.events.v1.FeesStats + 83, // 166: vega.snapshot.v1.Market.stop_orders:type_name -> vega.snapshot.v1.StopOrders + 213, // 167: vega.snapshot.v1.Market.expiring_stop_orders:type_name -> vega.Order + 73, // 168: vega.snapshot.v1.Market.product:type_name -> vega.snapshot.v1.Product + 220, // 169: vega.snapshot.v1.Market.fees_stats:type_name -> vega.events.v1.FeesStats 69, // 170: vega.snapshot.v1.Market.party_margin_factor:type_name -> vega.snapshot.v1.PartyMarginFactor - 186, // 171: vega.snapshot.v1.Market.mark_price_calculator:type_name -> vega.snapshot.v1.CompositePriceCalculator - 186, // 172: vega.snapshot.v1.Market.internal_composite_price_calculator:type_name -> vega.snapshot.v1.CompositePriceCalculator - 189, // 173: vega.snapshot.v1.Market.market_liquidity:type_name -> vega.snapshot.v1.MarketLiquidity - 74, // 174: vega.snapshot.v1.Product.perps:type_name -> vega.snapshot.v1.Perps - 71, // 175: vega.snapshot.v1.Perps.external_data_point:type_name -> vega.snapshot.v1.DataPoint - 71, // 176: vega.snapshot.v1.Perps.internal_data_point:type_name -> vega.snapshot.v1.DataPoint - 73, // 177: vega.snapshot.v1.Perps.external_twap_data:type_name -> vega.snapshot.v1.TWAPData - 73, // 178: vega.snapshot.v1.Perps.internal_twap_data:type_name -> vega.snapshot.v1.TWAPData - 72, // 179: vega.snapshot.v1.Perps.auction_intervals:type_name -> vega.snapshot.v1.AuctionIntervals - 75, // 180: vega.snapshot.v1.PricedStopOrders.falls_bellow:type_name -> vega.snapshot.v1.OrdersAtPrice - 75, // 181: vega.snapshot.v1.PricedStopOrders.rises_above:type_name -> vega.snapshot.v1.OrdersAtPrice - 79, // 182: vega.snapshot.v1.TrailingStopOrders.falls_bellow:type_name -> vega.snapshot.v1.OffsetsAtPrice - 79, // 183: vega.snapshot.v1.TrailingStopOrders.rises_above:type_name -> vega.snapshot.v1.OffsetsAtPrice - 78, // 184: vega.snapshot.v1.OffsetsAtPrice.offsets:type_name -> vega.snapshot.v1.OrdersAtOffset - 215, // 185: vega.snapshot.v1.StopOrders.stop_orders:type_name -> vega.events.v1.StopOrderEvent - 76, // 186: vega.snapshot.v1.StopOrders.priced_stop_orders:type_name -> vega.snapshot.v1.PricedStopOrders - 77, // 187: vega.snapshot.v1.StopOrders.trailing_stop_orders:type_name -> vega.snapshot.v1.TrailingStopOrders - 207, // 188: vega.snapshot.v1.PeggedOrders.parked_orders:type_name -> vega.Order - 68, // 189: vega.snapshot.v1.ExecutionMarkets.markets:type_name -> vega.snapshot.v1.Market - 67, // 190: vega.snapshot.v1.ExecutionMarkets.spot_markets:type_name -> vega.snapshot.v1.SpotMarket - 216, // 191: vega.snapshot.v1.ExecutionMarkets.settled_markets:type_name -> vega.checkpoint.v1.MarketState - 84, // 192: vega.snapshot.v1.ExecutionMarkets.successors:type_name -> vega.snapshot.v1.Successors - 82, // 193: vega.snapshot.v1.ExecutionMarkets.sla_network_params:type_name -> vega.snapshot.v1.SLANetworkParams - 85, // 194: vega.snapshot.v1.MarketPositions.positions:type_name -> vega.snapshot.v1.Position - 87, // 195: vega.snapshot.v1.MarketPositions.parties_records:type_name -> vega.snapshot.v1.PartyPositionStats - 89, // 196: vega.snapshot.v1.SettlementState.last_settled_positions:type_name -> vega.snapshot.v1.LastSettledPosition - 90, // 197: vega.snapshot.v1.SettlementState.trades:type_name -> vega.snapshot.v1.SettlementTrade - 94, // 198: vega.snapshot.v1.RewardsPendingPayouts.scheduled_rewards_payout:type_name -> vega.snapshot.v1.ScheduledRewardsPayout - 95, // 199: vega.snapshot.v1.ScheduledRewardsPayout.rewards_payout:type_name -> vega.snapshot.v1.RewardsPayout - 96, // 200: vega.snapshot.v1.RewardsPayout.reward_party_amount:type_name -> vega.snapshot.v1.RewardsPartyAmount - 99, // 201: vega.snapshot.v1.VoteSpamPolicy.party_to_vote:type_name -> vega.snapshot.v1.PartyProposalVoteCount - 153, // 202: vega.snapshot.v1.VoteSpamPolicy.banned_parties:type_name -> vega.snapshot.v1.BannedParty - 100, // 203: vega.snapshot.v1.VoteSpamPolicy.token_balance:type_name -> vega.snapshot.v1.PartyTokenBalance - 101, // 204: vega.snapshot.v1.VoteSpamPolicy.recent_blocks_reject_stats:type_name -> vega.snapshot.v1.BlockRejectStats - 102, // 205: vega.snapshot.v1.SimpleSpamPolicy.party_to_count:type_name -> vega.snapshot.v1.SpamPartyTransactionCount - 153, // 206: vega.snapshot.v1.SimpleSpamPolicy.banned_parties:type_name -> vega.snapshot.v1.BannedParty - 100, // 207: vega.snapshot.v1.SimpleSpamPolicy.token_balance:type_name -> vega.snapshot.v1.PartyTokenBalance - 104, // 208: vega.snapshot.v1.Notary.notary_sigs:type_name -> vega.snapshot.v1.NotarySigs - 108, // 209: vega.snapshot.v1.StakeVerifierDeposited.pending_deposited:type_name -> vega.snapshot.v1.StakeVerifierPending - 108, // 210: vega.snapshot.v1.StakeVerifierRemoved.pending_removed:type_name -> vega.snapshot.v1.StakeVerifierPending - 110, // 211: vega.snapshot.v1.L2EthOracles.chain_id_eth_oracles:type_name -> vega.snapshot.v1.ChainIdEthOracles - 111, // 212: vega.snapshot.v1.ChainIdEthOracles.last_block:type_name -> vega.snapshot.v1.EthOracleVerifierLastBlock - 113, // 213: vega.snapshot.v1.ChainIdEthOracles.call_results:type_name -> vega.snapshot.v1.EthContractCallResults - 112, // 214: vega.snapshot.v1.ChainIdEthOracles.misc:type_name -> vega.snapshot.v1.EthOracleVerifierMisc - 115, // 215: vega.snapshot.v1.EthOracleVerifierMisc.buckets:type_name -> vega.snapshot.v1.EthVerifierBucket - 111, // 216: vega.snapshot.v1.EthOracleVerifierMisc.patch_block:type_name -> vega.snapshot.v1.EthOracleVerifierLastBlock - 114, // 217: vega.snapshot.v1.EthContractCallResults.pending_contract_call_result:type_name -> vega.snapshot.v1.EthContractCallResult - 122, // 218: vega.snapshot.v1.Topology.validator_data:type_name -> vega.snapshot.v1.ValidatorState - 116, // 219: vega.snapshot.v1.Topology.pending_pub_key_rotations:type_name -> vega.snapshot.v1.PendingKeyRotation - 125, // 220: vega.snapshot.v1.Topology.validator_performance:type_name -> vega.snapshot.v1.ValidatorPerformance - 117, // 221: vega.snapshot.v1.Topology.pending_ethereum_key_rotations:type_name -> vega.snapshot.v1.PendingEthereumKeyRotation - 119, // 222: vega.snapshot.v1.Topology.signatures:type_name -> vega.snapshot.v1.ToplogySignatures - 117, // 223: vega.snapshot.v1.Topology.unsolved_ethereum_key_rotations:type_name -> vega.snapshot.v1.PendingEthereumKeyRotation - 120, // 224: vega.snapshot.v1.ToplogySignatures.pending_signatures:type_name -> vega.snapshot.v1.PendingERC20MultisigControlSignature - 121, // 225: vega.snapshot.v1.ToplogySignatures.issued_signatures:type_name -> vega.snapshot.v1.IssuedERC20MultisigControlSignature - 217, // 226: vega.snapshot.v1.ValidatorState.validator_update:type_name -> vega.events.v1.ValidatorUpdate - 123, // 227: vega.snapshot.v1.ValidatorState.heartbeat_tracker:type_name -> vega.snapshot.v1.HeartbeatTracker - 218, // 228: vega.snapshot.v1.ValidatorState.ranking_score:type_name -> vega.RankingScore - 124, // 229: vega.snapshot.v1.ValidatorPerformance.validator_perf_stats:type_name -> vega.snapshot.v1.PerformanceStats - 129, // 230: vega.snapshot.v1.LiquidityPartiesLiquidityOrders.party_orders:type_name -> vega.snapshot.v1.PartyOrders - 207, // 231: vega.snapshot.v1.PartyOrders.orders:type_name -> vega.Order - 129, // 232: vega.snapshot.v1.LiquidityPartiesOrders.party_orders:type_name -> vega.snapshot.v1.PartyOrders - 219, // 233: vega.snapshot.v1.LiquidityProvisions.liquidity_provisions:type_name -> vega.LiquidityProvision - 133, // 234: vega.snapshot.v1.LiquidityScores.scores:type_name -> vega.snapshot.v1.LiquidityScore - 220, // 235: vega.snapshot.v1.LiquidityV2Parameters.market_sla_parameters:type_name -> vega.LiquiditySLAParameters - 221, // 236: vega.snapshot.v1.LiquidityV2PaidFeesStats.stats:type_name -> vega.events.v1.PaidLiquidityFeesStats - 219, // 237: vega.snapshot.v1.LiquidityV2Provisions.liquidity_provisions:type_name -> vega.LiquidityProvision - 219, // 238: vega.snapshot.v1.LiquidityV2PendingProvisions.pending_liquidity_provisions:type_name -> vega.LiquidityProvision - 139, // 239: vega.snapshot.v1.LiquidityV2Performances.performance_per_party:type_name -> vega.snapshot.v1.LiquidityV2PerformancePerParty - 133, // 240: vega.snapshot.v1.LiquidityV2Scores.scores:type_name -> vega.snapshot.v1.LiquidityScore - 12, // 241: vega.snapshot.v1.LiquidityV2Supplied.bid_cache:type_name -> vega.snapshot.v1.LiquidityOffsetProbabilityPair - 12, // 242: vega.snapshot.v1.LiquidityV2Supplied.ask_cache:type_name -> vega.snapshot.v1.LiquidityOffsetProbabilityPair - 145, // 243: vega.snapshot.v1.FloatingPointConsensus.next_time_trigger:type_name -> vega.snapshot.v1.NextTimeTrigger - 143, // 244: vega.snapshot.v1.FloatingPointConsensus.state_variables:type_name -> vega.snapshot.v1.StateVarInternalState - 144, // 245: vega.snapshot.v1.StateVarInternalState.validators_results:type_name -> vega.snapshot.v1.FloatingPointValidatorResult - 222, // 246: vega.snapshot.v1.FloatingPointValidatorResult.bundle:type_name -> vega.KeyValueBundle - 223, // 247: vega.snapshot.v1.MarketTracker.market_activity:type_name -> vega.checkpoint.v1.MarketActivityTracker - 224, // 248: vega.snapshot.v1.MarketTracker.taker_notional_volume:type_name -> vega.checkpoint.v1.TakerNotionalVolume - 225, // 249: vega.snapshot.v1.MarketTracker.market_to_party_taker_notional_volume:type_name -> vega.checkpoint.v1.MarketToPartyTakerNotionalVolume - 226, // 250: vega.snapshot.v1.MarketTracker.epoch_taker_fees:type_name -> vega.checkpoint.v1.EpochPartyTakerFees - 227, // 251: vega.snapshot.v1.SignerEventsPerAddress.events:type_name -> vega.events.v1.ERC20MultiSigSignerEvent - 147, // 252: vega.snapshot.v1.ERC20MultiSigTopologyVerified.events_per_address:type_name -> vega.snapshot.v1.SignerEventsPerAddress - 228, // 253: vega.snapshot.v1.ERC20MultiSigTopologyVerified.threshold:type_name -> vega.events.v1.ERC20MultiSigThresholdSetEvent - 227, // 254: vega.snapshot.v1.ERC20MultiSigTopologyPending.pending_signers:type_name -> vega.events.v1.ERC20MultiSigSignerEvent - 228, // 255: vega.snapshot.v1.ERC20MultiSigTopologyPending.pending_threshold_set:type_name -> vega.events.v1.ERC20MultiSigThresholdSetEvent - 148, // 256: vega.snapshot.v1.EVMMultisigTopology.verified:type_name -> vega.snapshot.v1.ERC20MultiSigTopologyVerified - 149, // 257: vega.snapshot.v1.EVMMultisigTopology.pending:type_name -> vega.snapshot.v1.ERC20MultiSigTopologyPending - 150, // 258: vega.snapshot.v1.EVMMultisigTopologies.evm_multisig_topology:type_name -> vega.snapshot.v1.EVMMultisigTopology - 158, // 259: vega.snapshot.v1.ProofOfWork.tx_at_height:type_name -> vega.snapshot.v1.TransactionsAtHeight - 158, // 260: vega.snapshot.v1.ProofOfWork.tid_at_height:type_name -> vega.snapshot.v1.TransactionsAtHeight - 153, // 261: vega.snapshot.v1.ProofOfWork.banned:type_name -> vega.snapshot.v1.BannedParty - 154, // 262: vega.snapshot.v1.ProofOfWork.pow_params:type_name -> vega.snapshot.v1.ProofOfWorkParams - 155, // 263: vega.snapshot.v1.ProofOfWork.pow_state:type_name -> vega.snapshot.v1.ProofOfWorkState - 160, // 264: vega.snapshot.v1.ProofOfWork.nonce_refs_at_height:type_name -> vega.snapshot.v1.NonceRefsAtHeight - 156, // 265: vega.snapshot.v1.ProofOfWorkState.pow_state:type_name -> vega.snapshot.v1.ProofOfWorkBlockState - 157, // 266: vega.snapshot.v1.ProofOfWorkBlockState.party_state:type_name -> vega.snapshot.v1.ProofOfWorkPartyStateForBlock - 159, // 267: vega.snapshot.v1.NonceRefsAtHeight.refs:type_name -> vega.snapshot.v1.NonceRef - 229, // 268: vega.snapshot.v1.ProtocolUpgradeProposals.active_proposals:type_name -> vega.events.v1.ProtocolUpgradeEvent - 162, // 269: vega.snapshot.v1.ProtocolUpgradeProposals.accepted_proposal:type_name -> vega.snapshot.v1.AcceptedProtocolUpgradeProposal - 164, // 270: vega.snapshot.v1.Teams.teams:type_name -> vega.snapshot.v1.Team - 165, // 271: vega.snapshot.v1.Team.referrer:type_name -> vega.snapshot.v1.Membership - 165, // 272: vega.snapshot.v1.Team.referees:type_name -> vega.snapshot.v1.Membership - 167, // 273: vega.snapshot.v1.TeamSwitches.team_switches:type_name -> vega.snapshot.v1.TeamSwitch - 169, // 274: vega.snapshot.v1.Vesting.parties_reward:type_name -> vega.snapshot.v1.PartyReward - 174, // 275: vega.snapshot.v1.PartyReward.asset_locked:type_name -> vega.snapshot.v1.AssetLocked - 176, // 276: vega.snapshot.v1.PartyReward.in_vesting:type_name -> vega.snapshot.v1.InVesting - 173, // 277: vega.snapshot.v1.ReferralProgramData.factor_by_referee:type_name -> vega.snapshot.v1.FactorByReferee - 230, // 278: vega.snapshot.v1.ReferralProgramData.current_program:type_name -> vega.ReferralProgram - 230, // 279: vega.snapshot.v1.ReferralProgramData.new_program:type_name -> vega.ReferralProgram - 171, // 280: vega.snapshot.v1.ReferralProgramData.sets:type_name -> vega.snapshot.v1.ReferralSet - 165, // 281: vega.snapshot.v1.ReferralSet.referrer:type_name -> vega.snapshot.v1.Membership - 165, // 282: vega.snapshot.v1.ReferralSet.referees:type_name -> vega.snapshot.v1.Membership - 172, // 283: vega.snapshot.v1.ReferralSet.running_volumes:type_name -> vega.snapshot.v1.RunningVolume - 175, // 284: vega.snapshot.v1.AssetLocked.epoch_balances:type_name -> vega.snapshot.v1.EpochBalance - 178, // 285: vega.snapshot.v1.ActivityStreak.parties_activity_streak:type_name -> vega.snapshot.v1.PartyActivityStreak - 181, // 286: vega.snapshot.v1.VolumeDiscountProgram.epoch_party_volumes:type_name -> vega.snapshot.v1.EpochPartyVolumes - 182, // 287: vega.snapshot.v1.VolumeDiscountProgram.average_party_volume:type_name -> vega.snapshot.v1.PartyVolume - 231, // 288: vega.snapshot.v1.VolumeDiscountProgram.current_program:type_name -> vega.VolumeDiscountProgram - 231, // 289: vega.snapshot.v1.VolumeDiscountProgram.new_program:type_name -> vega.VolumeDiscountProgram - 180, // 290: vega.snapshot.v1.VolumeDiscountProgram.factors_by_party:type_name -> vega.snapshot.v1.VolumeDiscountStats - 182, // 291: vega.snapshot.v1.EpochPartyVolumes.party_volume:type_name -> vega.snapshot.v1.PartyVolume - 232, // 292: vega.snapshot.v1.Liquidation.config:type_name -> vega.LiquidationStrategy - 184, // 293: vega.snapshot.v1.BankingTransferFeeDiscounts.party_asset_discount:type_name -> vega.snapshot.v1.PartyAssetAmount - 233, // 294: vega.snapshot.v1.CompositePriceCalculator.price_configuration:type_name -> vega.CompositePriceConfiguration - 234, // 295: vega.snapshot.v1.CompositePriceCalculator.trades:type_name -> vega.Trade - 55, // 296: vega.snapshot.v1.CompositePriceCalculator.book_price_at_time:type_name -> vega.snapshot.v1.TimePrice - 188, // 297: vega.snapshot.v1.Parties.profiles:type_name -> vega.snapshot.v1.PartyProfile - 235, // 298: vega.snapshot.v1.PartyProfile.metadata:type_name -> vega.Metadata - 299, // [299:299] is the sub-list for method output_type - 299, // [299:299] is the sub-list for method input_type - 299, // [299:299] is the sub-list for extension type_name - 299, // [299:299] is the sub-list for extension extendee - 0, // [0:299] is the sub-list for field type_name + 189, // 171: vega.snapshot.v1.Market.mark_price_calculator:type_name -> vega.snapshot.v1.CompositePriceCalculator + 189, // 172: vega.snapshot.v1.Market.internal_composite_price_calculator:type_name -> vega.snapshot.v1.CompositePriceCalculator + 193, // 173: vega.snapshot.v1.Market.market_liquidity:type_name -> vega.snapshot.v1.MarketLiquidity + 70, // 174: vega.snapshot.v1.Market.amm:type_name -> vega.snapshot.v1.AmmState + 72, // 175: vega.snapshot.v1.AmmState.sqrter:type_name -> vega.snapshot.v1.StringMapEntry + 72, // 176: vega.snapshot.v1.AmmState.sub_accounts:type_name -> vega.snapshot.v1.StringMapEntry + 71, // 177: vega.snapshot.v1.AmmState.pools:type_name -> vega.snapshot.v1.PoolMapEntry + 195, // 178: vega.snapshot.v1.PoolMapEntry.pool:type_name -> vega.snapshot.v1.PoolMapEntry.Pool + 77, // 179: vega.snapshot.v1.Product.perps:type_name -> vega.snapshot.v1.Perps + 74, // 180: vega.snapshot.v1.Perps.external_data_point:type_name -> vega.snapshot.v1.DataPoint + 74, // 181: vega.snapshot.v1.Perps.internal_data_point:type_name -> vega.snapshot.v1.DataPoint + 76, // 182: vega.snapshot.v1.Perps.external_twap_data:type_name -> vega.snapshot.v1.TWAPData + 76, // 183: vega.snapshot.v1.Perps.internal_twap_data:type_name -> vega.snapshot.v1.TWAPData + 75, // 184: vega.snapshot.v1.Perps.auction_intervals:type_name -> vega.snapshot.v1.AuctionIntervals + 78, // 185: vega.snapshot.v1.PricedStopOrders.falls_bellow:type_name -> vega.snapshot.v1.OrdersAtPrice + 78, // 186: vega.snapshot.v1.PricedStopOrders.rises_above:type_name -> vega.snapshot.v1.OrdersAtPrice + 82, // 187: vega.snapshot.v1.TrailingStopOrders.falls_bellow:type_name -> vega.snapshot.v1.OffsetsAtPrice + 82, // 188: vega.snapshot.v1.TrailingStopOrders.rises_above:type_name -> vega.snapshot.v1.OffsetsAtPrice + 81, // 189: vega.snapshot.v1.OffsetsAtPrice.offsets:type_name -> vega.snapshot.v1.OrdersAtOffset + 221, // 190: vega.snapshot.v1.StopOrders.stop_orders:type_name -> vega.events.v1.StopOrderEvent + 79, // 191: vega.snapshot.v1.StopOrders.priced_stop_orders:type_name -> vega.snapshot.v1.PricedStopOrders + 80, // 192: vega.snapshot.v1.StopOrders.trailing_stop_orders:type_name -> vega.snapshot.v1.TrailingStopOrders + 213, // 193: vega.snapshot.v1.PeggedOrders.parked_orders:type_name -> vega.Order + 68, // 194: vega.snapshot.v1.ExecutionMarkets.markets:type_name -> vega.snapshot.v1.Market + 67, // 195: vega.snapshot.v1.ExecutionMarkets.spot_markets:type_name -> vega.snapshot.v1.SpotMarket + 222, // 196: vega.snapshot.v1.ExecutionMarkets.settled_markets:type_name -> vega.checkpoint.v1.MarketState + 87, // 197: vega.snapshot.v1.ExecutionMarkets.successors:type_name -> vega.snapshot.v1.Successors + 85, // 198: vega.snapshot.v1.ExecutionMarkets.sla_network_params:type_name -> vega.snapshot.v1.SLANetworkParams + 88, // 199: vega.snapshot.v1.MarketPositions.positions:type_name -> vega.snapshot.v1.Position + 90, // 200: vega.snapshot.v1.MarketPositions.parties_records:type_name -> vega.snapshot.v1.PartyPositionStats + 92, // 201: vega.snapshot.v1.SettlementState.last_settled_positions:type_name -> vega.snapshot.v1.LastSettledPosition + 93, // 202: vega.snapshot.v1.SettlementState.trades:type_name -> vega.snapshot.v1.SettlementTrade + 97, // 203: vega.snapshot.v1.RewardsPendingPayouts.scheduled_rewards_payout:type_name -> vega.snapshot.v1.ScheduledRewardsPayout + 98, // 204: vega.snapshot.v1.ScheduledRewardsPayout.rewards_payout:type_name -> vega.snapshot.v1.RewardsPayout + 99, // 205: vega.snapshot.v1.RewardsPayout.reward_party_amount:type_name -> vega.snapshot.v1.RewardsPartyAmount + 102, // 206: vega.snapshot.v1.VoteSpamPolicy.party_to_vote:type_name -> vega.snapshot.v1.PartyProposalVoteCount + 156, // 207: vega.snapshot.v1.VoteSpamPolicy.banned_parties:type_name -> vega.snapshot.v1.BannedParty + 103, // 208: vega.snapshot.v1.VoteSpamPolicy.token_balance:type_name -> vega.snapshot.v1.PartyTokenBalance + 104, // 209: vega.snapshot.v1.VoteSpamPolicy.recent_blocks_reject_stats:type_name -> vega.snapshot.v1.BlockRejectStats + 105, // 210: vega.snapshot.v1.SimpleSpamPolicy.party_to_count:type_name -> vega.snapshot.v1.SpamPartyTransactionCount + 156, // 211: vega.snapshot.v1.SimpleSpamPolicy.banned_parties:type_name -> vega.snapshot.v1.BannedParty + 103, // 212: vega.snapshot.v1.SimpleSpamPolicy.token_balance:type_name -> vega.snapshot.v1.PartyTokenBalance + 107, // 213: vega.snapshot.v1.Notary.notary_sigs:type_name -> vega.snapshot.v1.NotarySigs + 111, // 214: vega.snapshot.v1.StakeVerifierDeposited.pending_deposited:type_name -> vega.snapshot.v1.StakeVerifierPending + 111, // 215: vega.snapshot.v1.StakeVerifierRemoved.pending_removed:type_name -> vega.snapshot.v1.StakeVerifierPending + 113, // 216: vega.snapshot.v1.L2EthOracles.chain_id_eth_oracles:type_name -> vega.snapshot.v1.ChainIdEthOracles + 114, // 217: vega.snapshot.v1.ChainIdEthOracles.last_block:type_name -> vega.snapshot.v1.EthOracleVerifierLastBlock + 116, // 218: vega.snapshot.v1.ChainIdEthOracles.call_results:type_name -> vega.snapshot.v1.EthContractCallResults + 115, // 219: vega.snapshot.v1.ChainIdEthOracles.misc:type_name -> vega.snapshot.v1.EthOracleVerifierMisc + 118, // 220: vega.snapshot.v1.EthOracleVerifierMisc.buckets:type_name -> vega.snapshot.v1.EthVerifierBucket + 114, // 221: vega.snapshot.v1.EthOracleVerifierMisc.patch_block:type_name -> vega.snapshot.v1.EthOracleVerifierLastBlock + 117, // 222: vega.snapshot.v1.EthContractCallResults.pending_contract_call_result:type_name -> vega.snapshot.v1.EthContractCallResult + 125, // 223: vega.snapshot.v1.Topology.validator_data:type_name -> vega.snapshot.v1.ValidatorState + 119, // 224: vega.snapshot.v1.Topology.pending_pub_key_rotations:type_name -> vega.snapshot.v1.PendingKeyRotation + 128, // 225: vega.snapshot.v1.Topology.validator_performance:type_name -> vega.snapshot.v1.ValidatorPerformance + 120, // 226: vega.snapshot.v1.Topology.pending_ethereum_key_rotations:type_name -> vega.snapshot.v1.PendingEthereumKeyRotation + 122, // 227: vega.snapshot.v1.Topology.signatures:type_name -> vega.snapshot.v1.ToplogySignatures + 120, // 228: vega.snapshot.v1.Topology.unsolved_ethereum_key_rotations:type_name -> vega.snapshot.v1.PendingEthereumKeyRotation + 123, // 229: vega.snapshot.v1.ToplogySignatures.pending_signatures:type_name -> vega.snapshot.v1.PendingERC20MultisigControlSignature + 124, // 230: vega.snapshot.v1.ToplogySignatures.issued_signatures:type_name -> vega.snapshot.v1.IssuedERC20MultisigControlSignature + 223, // 231: vega.snapshot.v1.ValidatorState.validator_update:type_name -> vega.events.v1.ValidatorUpdate + 126, // 232: vega.snapshot.v1.ValidatorState.heartbeat_tracker:type_name -> vega.snapshot.v1.HeartbeatTracker + 224, // 233: vega.snapshot.v1.ValidatorState.ranking_score:type_name -> vega.RankingScore + 127, // 234: vega.snapshot.v1.ValidatorPerformance.validator_perf_stats:type_name -> vega.snapshot.v1.PerformanceStats + 132, // 235: vega.snapshot.v1.LiquidityPartiesLiquidityOrders.party_orders:type_name -> vega.snapshot.v1.PartyOrders + 213, // 236: vega.snapshot.v1.PartyOrders.orders:type_name -> vega.Order + 132, // 237: vega.snapshot.v1.LiquidityPartiesOrders.party_orders:type_name -> vega.snapshot.v1.PartyOrders + 225, // 238: vega.snapshot.v1.LiquidityProvisions.liquidity_provisions:type_name -> vega.LiquidityProvision + 136, // 239: vega.snapshot.v1.LiquidityScores.scores:type_name -> vega.snapshot.v1.LiquidityScore + 226, // 240: vega.snapshot.v1.LiquidityV2Parameters.market_sla_parameters:type_name -> vega.LiquiditySLAParameters + 227, // 241: vega.snapshot.v1.LiquidityV2PaidFeesStats.stats:type_name -> vega.events.v1.PaidLiquidityFeesStats + 225, // 242: vega.snapshot.v1.LiquidityV2Provisions.liquidity_provisions:type_name -> vega.LiquidityProvision + 225, // 243: vega.snapshot.v1.LiquidityV2PendingProvisions.pending_liquidity_provisions:type_name -> vega.LiquidityProvision + 142, // 244: vega.snapshot.v1.LiquidityV2Performances.performance_per_party:type_name -> vega.snapshot.v1.LiquidityV2PerformancePerParty + 136, // 245: vega.snapshot.v1.LiquidityV2Scores.scores:type_name -> vega.snapshot.v1.LiquidityScore + 12, // 246: vega.snapshot.v1.LiquidityV2Supplied.bid_cache:type_name -> vega.snapshot.v1.LiquidityOffsetProbabilityPair + 12, // 247: vega.snapshot.v1.LiquidityV2Supplied.ask_cache:type_name -> vega.snapshot.v1.LiquidityOffsetProbabilityPair + 148, // 248: vega.snapshot.v1.FloatingPointConsensus.next_time_trigger:type_name -> vega.snapshot.v1.NextTimeTrigger + 146, // 249: vega.snapshot.v1.FloatingPointConsensus.state_variables:type_name -> vega.snapshot.v1.StateVarInternalState + 147, // 250: vega.snapshot.v1.StateVarInternalState.validators_results:type_name -> vega.snapshot.v1.FloatingPointValidatorResult + 228, // 251: vega.snapshot.v1.FloatingPointValidatorResult.bundle:type_name -> vega.KeyValueBundle + 229, // 252: vega.snapshot.v1.MarketTracker.market_activity:type_name -> vega.checkpoint.v1.MarketActivityTracker + 230, // 253: vega.snapshot.v1.MarketTracker.taker_notional_volume:type_name -> vega.checkpoint.v1.TakerNotionalVolume + 231, // 254: vega.snapshot.v1.MarketTracker.market_to_party_taker_notional_volume:type_name -> vega.checkpoint.v1.MarketToPartyTakerNotionalVolume + 232, // 255: vega.snapshot.v1.MarketTracker.epoch_taker_fees:type_name -> vega.checkpoint.v1.EpochPartyTakerFees + 233, // 256: vega.snapshot.v1.SignerEventsPerAddress.events:type_name -> vega.events.v1.ERC20MultiSigSignerEvent + 150, // 257: vega.snapshot.v1.ERC20MultiSigTopologyVerified.events_per_address:type_name -> vega.snapshot.v1.SignerEventsPerAddress + 234, // 258: vega.snapshot.v1.ERC20MultiSigTopologyVerified.threshold:type_name -> vega.events.v1.ERC20MultiSigThresholdSetEvent + 233, // 259: vega.snapshot.v1.ERC20MultiSigTopologyPending.pending_signers:type_name -> vega.events.v1.ERC20MultiSigSignerEvent + 234, // 260: vega.snapshot.v1.ERC20MultiSigTopologyPending.pending_threshold_set:type_name -> vega.events.v1.ERC20MultiSigThresholdSetEvent + 151, // 261: vega.snapshot.v1.EVMMultisigTopology.verified:type_name -> vega.snapshot.v1.ERC20MultiSigTopologyVerified + 152, // 262: vega.snapshot.v1.EVMMultisigTopology.pending:type_name -> vega.snapshot.v1.ERC20MultiSigTopologyPending + 153, // 263: vega.snapshot.v1.EVMMultisigTopologies.evm_multisig_topology:type_name -> vega.snapshot.v1.EVMMultisigTopology + 161, // 264: vega.snapshot.v1.ProofOfWork.tx_at_height:type_name -> vega.snapshot.v1.TransactionsAtHeight + 161, // 265: vega.snapshot.v1.ProofOfWork.tid_at_height:type_name -> vega.snapshot.v1.TransactionsAtHeight + 156, // 266: vega.snapshot.v1.ProofOfWork.banned:type_name -> vega.snapshot.v1.BannedParty + 157, // 267: vega.snapshot.v1.ProofOfWork.pow_params:type_name -> vega.snapshot.v1.ProofOfWorkParams + 158, // 268: vega.snapshot.v1.ProofOfWork.pow_state:type_name -> vega.snapshot.v1.ProofOfWorkState + 163, // 269: vega.snapshot.v1.ProofOfWork.nonce_refs_at_height:type_name -> vega.snapshot.v1.NonceRefsAtHeight + 159, // 270: vega.snapshot.v1.ProofOfWorkState.pow_state:type_name -> vega.snapshot.v1.ProofOfWorkBlockState + 160, // 271: vega.snapshot.v1.ProofOfWorkBlockState.party_state:type_name -> vega.snapshot.v1.ProofOfWorkPartyStateForBlock + 162, // 272: vega.snapshot.v1.NonceRefsAtHeight.refs:type_name -> vega.snapshot.v1.NonceRef + 235, // 273: vega.snapshot.v1.ProtocolUpgradeProposals.active_proposals:type_name -> vega.events.v1.ProtocolUpgradeEvent + 165, // 274: vega.snapshot.v1.ProtocolUpgradeProposals.accepted_proposal:type_name -> vega.snapshot.v1.AcceptedProtocolUpgradeProposal + 167, // 275: vega.snapshot.v1.Teams.teams:type_name -> vega.snapshot.v1.Team + 168, // 276: vega.snapshot.v1.Team.referrer:type_name -> vega.snapshot.v1.Membership + 168, // 277: vega.snapshot.v1.Team.referees:type_name -> vega.snapshot.v1.Membership + 170, // 278: vega.snapshot.v1.TeamSwitches.team_switches:type_name -> vega.snapshot.v1.TeamSwitch + 172, // 279: vega.snapshot.v1.Vesting.parties_reward:type_name -> vega.snapshot.v1.PartyReward + 177, // 280: vega.snapshot.v1.PartyReward.asset_locked:type_name -> vega.snapshot.v1.AssetLocked + 179, // 281: vega.snapshot.v1.PartyReward.in_vesting:type_name -> vega.snapshot.v1.InVesting + 176, // 282: vega.snapshot.v1.ReferralProgramData.factor_by_referee:type_name -> vega.snapshot.v1.FactorByReferee + 236, // 283: vega.snapshot.v1.ReferralProgramData.current_program:type_name -> vega.ReferralProgram + 236, // 284: vega.snapshot.v1.ReferralProgramData.new_program:type_name -> vega.ReferralProgram + 174, // 285: vega.snapshot.v1.ReferralProgramData.sets:type_name -> vega.snapshot.v1.ReferralSet + 168, // 286: vega.snapshot.v1.ReferralSet.referrer:type_name -> vega.snapshot.v1.Membership + 168, // 287: vega.snapshot.v1.ReferralSet.referees:type_name -> vega.snapshot.v1.Membership + 175, // 288: vega.snapshot.v1.ReferralSet.running_volumes:type_name -> vega.snapshot.v1.RunningVolume + 178, // 289: vega.snapshot.v1.AssetLocked.epoch_balances:type_name -> vega.snapshot.v1.EpochBalance + 181, // 290: vega.snapshot.v1.ActivityStreak.parties_activity_streak:type_name -> vega.snapshot.v1.PartyActivityStreak + 184, // 291: vega.snapshot.v1.VolumeDiscountProgram.epoch_party_volumes:type_name -> vega.snapshot.v1.EpochPartyVolumes + 185, // 292: vega.snapshot.v1.VolumeDiscountProgram.average_party_volume:type_name -> vega.snapshot.v1.PartyVolume + 237, // 293: vega.snapshot.v1.VolumeDiscountProgram.current_program:type_name -> vega.VolumeDiscountProgram + 237, // 294: vega.snapshot.v1.VolumeDiscountProgram.new_program:type_name -> vega.VolumeDiscountProgram + 183, // 295: vega.snapshot.v1.VolumeDiscountProgram.factors_by_party:type_name -> vega.snapshot.v1.VolumeDiscountStats + 185, // 296: vega.snapshot.v1.EpochPartyVolumes.party_volume:type_name -> vega.snapshot.v1.PartyVolume + 238, // 297: vega.snapshot.v1.Liquidation.config:type_name -> vega.LiquidationStrategy + 187, // 298: vega.snapshot.v1.BankingTransferFeeDiscounts.party_asset_discount:type_name -> vega.snapshot.v1.PartyAssetAmount + 239, // 299: vega.snapshot.v1.CompositePriceCalculator.price_configuration:type_name -> vega.CompositePriceConfiguration + 240, // 300: vega.snapshot.v1.CompositePriceCalculator.trades:type_name -> vega.Trade + 55, // 301: vega.snapshot.v1.CompositePriceCalculator.book_price_at_time:type_name -> vega.snapshot.v1.TimePrice + 191, // 302: vega.snapshot.v1.Parties.profiles:type_name -> vega.snapshot.v1.PartyProfile + 241, // 303: vega.snapshot.v1.PartyProfile.metadata:type_name -> vega.Metadata + 192, // 304: vega.snapshot.v1.MarketLiquidity.amm:type_name -> vega.snapshot.v1.AMMValues + 242, // 305: vega.snapshot.v1.PoolMapEntry.Pool.parameters:type_name -> vega.events.v1.AMMPool.ConcentratedLiquidityParameters + 194, // 306: vega.snapshot.v1.PoolMapEntry.Pool.lower:type_name -> vega.snapshot.v1.PoolMapEntry.Curve + 194, // 307: vega.snapshot.v1.PoolMapEntry.Pool.upper:type_name -> vega.snapshot.v1.PoolMapEntry.Curve + 243, // 308: vega.snapshot.v1.PoolMapEntry.Pool.status:type_name -> vega.events.v1.AMMPool.Status + 309, // [309:309] is the sub-list for method output_type + 309, // [309:309] is the sub-list for method input_type + 309, // [309:309] is the sub-list for extension type_name + 309, // [309:309] is the sub-list for extension extendee + 0, // [0:309] is the sub-list for field type_name } func init() { file_vega_snapshot_v1_snapshot_proto_init() } @@ -17794,7 +18347,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Product); i { + switch v := v.(*AmmState); i { case 0: return &v.state case 1: @@ -17806,7 +18359,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataPoint); i { + switch v := v.(*PoolMapEntry); i { case 0: return &v.state case 1: @@ -17818,7 +18371,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuctionIntervals); i { + switch v := v.(*StringMapEntry); i { case 0: return &v.state case 1: @@ -17830,7 +18383,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TWAPData); i { + switch v := v.(*Product); i { case 0: return &v.state case 1: @@ -17842,7 +18395,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Perps); i { + switch v := v.(*DataPoint); i { case 0: return &v.state case 1: @@ -17854,6 +18407,42 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuctionIntervals); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_snapshot_v1_snapshot_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TWAPData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_snapshot_v1_snapshot_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Perps); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_snapshot_v1_snapshot_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrdersAtPrice); i { case 0: return &v.state @@ -17865,7 +18454,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PricedStopOrders); i { case 0: return &v.state @@ -17877,7 +18466,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TrailingStopOrders); i { case 0: return &v.state @@ -17889,7 +18478,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrdersAtOffset); i { case 0: return &v.state @@ -17901,7 +18490,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OffsetsAtPrice); i { case 0: return &v.state @@ -17913,7 +18502,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StopOrders); i { case 0: return &v.state @@ -17925,7 +18514,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PeggedOrders); i { case 0: return &v.state @@ -17937,7 +18526,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SLANetworkParams); i { case 0: return &v.state @@ -17949,7 +18538,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExecutionMarkets); i { case 0: return &v.state @@ -17961,7 +18550,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Successors); i { case 0: return &v.state @@ -17973,7 +18562,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Position); i { case 0: return &v.state @@ -17985,7 +18574,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MarketPositions); i { case 0: return &v.state @@ -17997,7 +18586,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PartyPositionStats); i { case 0: return &v.state @@ -18009,7 +18598,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SettlementState); i { case 0: return &v.state @@ -18021,7 +18610,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LastSettledPosition); i { case 0: return &v.state @@ -18033,7 +18622,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SettlementTrade); i { case 0: return &v.state @@ -18045,7 +18634,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppState); i { case 0: return &v.state @@ -18057,7 +18646,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EpochState); i { case 0: return &v.state @@ -18069,7 +18658,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RewardsPendingPayouts); i { case 0: return &v.state @@ -18081,7 +18670,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ScheduledRewardsPayout); i { case 0: return &v.state @@ -18093,7 +18682,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RewardsPayout); i { case 0: return &v.state @@ -18105,7 +18694,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RewardsPartyAmount); i { case 0: return &v.state @@ -18117,7 +18706,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LimitState); i { case 0: return &v.state @@ -18129,7 +18718,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VoteSpamPolicy); i { case 0: return &v.state @@ -18141,7 +18730,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PartyProposalVoteCount); i { case 0: return &v.state @@ -18153,7 +18742,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PartyTokenBalance); i { case 0: return &v.state @@ -18165,7 +18754,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BlockRejectStats); i { case 0: return &v.state @@ -18177,7 +18766,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SpamPartyTransactionCount); i { case 0: return &v.state @@ -18189,7 +18778,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SimpleSpamPolicy); i { case 0: return &v.state @@ -18201,7 +18790,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NotarySigs); i { case 0: return &v.state @@ -18213,7 +18802,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Notary); i { case 0: return &v.state @@ -18225,7 +18814,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StakeVerifierDeposited); i { case 0: return &v.state @@ -18237,7 +18826,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StakeVerifierRemoved); i { case 0: return &v.state @@ -18249,7 +18838,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StakeVerifierPending); i { case 0: return &v.state @@ -18261,7 +18850,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*L2EthOracles); i { case 0: return &v.state @@ -18273,7 +18862,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChainIdEthOracles); i { case 0: return &v.state @@ -18285,7 +18874,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EthOracleVerifierLastBlock); i { case 0: return &v.state @@ -18297,7 +18886,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EthOracleVerifierMisc); i { case 0: return &v.state @@ -18309,7 +18898,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EthContractCallResults); i { case 0: return &v.state @@ -18321,7 +18910,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EthContractCallResult); i { case 0: return &v.state @@ -18333,7 +18922,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EthVerifierBucket); i { case 0: return &v.state @@ -18345,7 +18934,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PendingKeyRotation); i { case 0: return &v.state @@ -18357,7 +18946,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PendingEthereumKeyRotation); i { case 0: return &v.state @@ -18369,7 +18958,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Topology); i { case 0: return &v.state @@ -18381,7 +18970,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ToplogySignatures); i { case 0: return &v.state @@ -18393,7 +18982,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PendingERC20MultisigControlSignature); i { case 0: return &v.state @@ -18405,7 +18994,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IssuedERC20MultisigControlSignature); i { case 0: return &v.state @@ -18417,7 +19006,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidatorState); i { case 0: return &v.state @@ -18429,7 +19018,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HeartbeatTracker); i { case 0: return &v.state @@ -18441,7 +19030,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PerformanceStats); i { case 0: return &v.state @@ -18453,7 +19042,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidatorPerformance); i { case 0: return &v.state @@ -18465,7 +19054,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityParameters); i { case 0: return &v.state @@ -18477,7 +19066,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityPendingProvisions); i { case 0: return &v.state @@ -18489,7 +19078,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityPartiesLiquidityOrders); i { case 0: return &v.state @@ -18501,7 +19090,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PartyOrders); i { case 0: return &v.state @@ -18513,7 +19102,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityPartiesOrders); i { case 0: return &v.state @@ -18525,7 +19114,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityProvisions); i { case 0: return &v.state @@ -18537,7 +19126,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityScores); i { case 0: return &v.state @@ -18549,7 +19138,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityScore); i { case 0: return &v.state @@ -18561,7 +19150,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityV2Parameters); i { case 0: return &v.state @@ -18573,7 +19162,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityV2PaidFeesStats); i { case 0: return &v.state @@ -18585,7 +19174,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityV2Provisions); i { case 0: return &v.state @@ -18597,7 +19186,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityV2PendingProvisions); i { case 0: return &v.state @@ -18609,7 +19198,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityV2Performances); i { case 0: return &v.state @@ -18621,7 +19210,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityV2PerformancePerParty); i { case 0: return &v.state @@ -18633,7 +19222,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityV2Scores); i { case 0: return &v.state @@ -18645,7 +19234,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityV2Supplied); i { case 0: return &v.state @@ -18657,7 +19246,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FloatingPointConsensus); i { case 0: return &v.state @@ -18669,7 +19258,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StateVarInternalState); i { case 0: return &v.state @@ -18681,7 +19270,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FloatingPointValidatorResult); i { case 0: return &v.state @@ -18693,7 +19282,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[147].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NextTimeTrigger); i { case 0: return &v.state @@ -18705,7 +19294,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[148].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MarketTracker); i { case 0: return &v.state @@ -18717,7 +19306,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[149].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SignerEventsPerAddress); i { case 0: return &v.state @@ -18729,7 +19318,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[147].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[150].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ERC20MultiSigTopologyVerified); i { case 0: return &v.state @@ -18741,7 +19330,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[148].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[151].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ERC20MultiSigTopologyPending); i { case 0: return &v.state @@ -18753,7 +19342,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[149].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[152].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EVMMultisigTopology); i { case 0: return &v.state @@ -18765,7 +19354,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[150].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[153].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EVMMultisigTopologies); i { case 0: return &v.state @@ -18777,7 +19366,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[151].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[154].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProofOfWork); i { case 0: return &v.state @@ -18789,7 +19378,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[152].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[155].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BannedParty); i { case 0: return &v.state @@ -18801,7 +19390,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[153].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[156].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProofOfWorkParams); i { case 0: return &v.state @@ -18813,7 +19402,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[154].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[157].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProofOfWorkState); i { case 0: return &v.state @@ -18825,7 +19414,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[155].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[158].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProofOfWorkBlockState); i { case 0: return &v.state @@ -18837,7 +19426,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[156].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[159].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProofOfWorkPartyStateForBlock); i { case 0: return &v.state @@ -18849,7 +19438,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[157].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[160].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionsAtHeight); i { case 0: return &v.state @@ -18861,7 +19450,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[158].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[161].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NonceRef); i { case 0: return &v.state @@ -18873,7 +19462,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[159].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[162].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NonceRefsAtHeight); i { case 0: return &v.state @@ -18885,7 +19474,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[160].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[163].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProtocolUpgradeProposals); i { case 0: return &v.state @@ -18897,7 +19486,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[161].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[164].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AcceptedProtocolUpgradeProposal); i { case 0: return &v.state @@ -18909,7 +19498,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[162].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[165].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Teams); i { case 0: return &v.state @@ -18921,7 +19510,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[163].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[166].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Team); i { case 0: return &v.state @@ -18933,7 +19522,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[164].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[167].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Membership); i { case 0: return &v.state @@ -18945,7 +19534,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[165].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[168].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamSwitches); i { case 0: return &v.state @@ -18957,7 +19546,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[166].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[169].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamSwitch); i { case 0: return &v.state @@ -18969,7 +19558,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[167].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[170].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Vesting); i { case 0: return &v.state @@ -18981,7 +19570,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[168].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[171].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PartyReward); i { case 0: return &v.state @@ -18993,7 +19582,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[169].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[172].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReferralProgramData); i { case 0: return &v.state @@ -19005,7 +19594,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[170].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[173].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReferralSet); i { case 0: return &v.state @@ -19017,7 +19606,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[171].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[174].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RunningVolume); i { case 0: return &v.state @@ -19029,7 +19618,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[172].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[175].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FactorByReferee); i { case 0: return &v.state @@ -19041,7 +19630,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[173].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[176].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AssetLocked); i { case 0: return &v.state @@ -19053,7 +19642,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[174].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[177].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EpochBalance); i { case 0: return &v.state @@ -19065,7 +19654,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[175].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[178].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InVesting); i { case 0: return &v.state @@ -19077,7 +19666,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[176].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[179].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ActivityStreak); i { case 0: return &v.state @@ -19089,7 +19678,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[177].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[180].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PartyActivityStreak); i { case 0: return &v.state @@ -19101,7 +19690,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[178].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[181].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeDiscountProgram); i { case 0: return &v.state @@ -19113,7 +19702,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[179].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[182].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeDiscountStats); i { case 0: return &v.state @@ -19125,7 +19714,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[180].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[183].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EpochPartyVolumes); i { case 0: return &v.state @@ -19137,7 +19726,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[181].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[184].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PartyVolume); i { case 0: return &v.state @@ -19149,7 +19738,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[182].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[185].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Liquidation); i { case 0: return &v.state @@ -19161,7 +19750,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[183].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[186].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PartyAssetAmount); i { case 0: return &v.state @@ -19173,7 +19762,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[184].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[187].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BankingTransferFeeDiscounts); i { case 0: return &v.state @@ -19185,7 +19774,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[185].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[188].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CompositePriceCalculator); i { case 0: return &v.state @@ -19197,7 +19786,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[186].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[189].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Parties); i { case 0: return &v.state @@ -19209,7 +19798,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[187].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[190].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PartyProfile); i { case 0: return &v.state @@ -19221,7 +19810,19 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } - file_vega_snapshot_v1_snapshot_proto_msgTypes[188].Exporter = func(v interface{}, i int) interface{} { + file_vega_snapshot_v1_snapshot_proto_msgTypes[191].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AMMValues); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_snapshot_v1_snapshot_proto_msgTypes[192].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MarketLiquidity); i { case 0: return &v.state @@ -19233,6 +19834,30 @@ func file_vega_snapshot_v1_snapshot_proto_init() { return nil } } + file_vega_snapshot_v1_snapshot_proto_msgTypes[193].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PoolMapEntry_Curve); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_snapshot_v1_snapshot_proto_msgTypes[194].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PoolMapEntry_Pool); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_vega_snapshot_v1_snapshot_proto_msgTypes[4].OneofWrappers = []interface{}{ (*Payload_ActiveAssets)(nil), @@ -19317,18 +19942,18 @@ func file_vega_snapshot_v1_snapshot_proto_init() { (*Payload_EvmMultisigTopologies)(nil), } file_vega_snapshot_v1_snapshot_proto_msgTypes[67].OneofWrappers = []interface{}{} - file_vega_snapshot_v1_snapshot_proto_msgTypes[69].OneofWrappers = []interface{}{ + file_vega_snapshot_v1_snapshot_proto_msgTypes[72].OneofWrappers = []interface{}{ (*Product_Perps)(nil), } - file_vega_snapshot_v1_snapshot_proto_msgTypes[86].OneofWrappers = []interface{}{} - file_vega_snapshot_v1_snapshot_proto_msgTypes[113].OneofWrappers = []interface{}{} + file_vega_snapshot_v1_snapshot_proto_msgTypes[89].OneofWrappers = []interface{}{} + file_vega_snapshot_v1_snapshot_proto_msgTypes[116].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vega_snapshot_v1_snapshot_proto_rawDesc, NumEnums: 1, - NumMessages: 189, + NumMessages: 195, NumExtensions: 0, NumServices: 0, }, diff --git a/protos/vega/vega.pb.go b/protos/vega/vega.pb.go index 205f9f42017..7dc5768450d 100644 --- a/protos/vega/vega.pb.go +++ b/protos/vega/vega.pb.go @@ -928,6 +928,12 @@ const ( TransferType_TRANSFER_TYPE_ISOLATED_MARGIN_LOW TransferType = 47 // Transfer from excess order margin account to general account. TransferType_TRANSFER_TYPE_ISOLATED_MARGIN_HIGH TransferType = 48 + // Transfer from a party's general account to their AMM's sub-account. + TransferType_TRANSFER_TYPE_AMM_SUBACCOUNT_LOW TransferType = 49 + // Transfer from an AMM's sub-account to their owner's general account. + TransferType_TRANSFER_TYPE_AMM_SUBACCOUNT_HIGH TransferType = 50 + // Transfer releasing an AMM's general account upon closure. + TransferType_TRANSFER_TYPE_AMM_SUBACCOUNT_RELEASE TransferType = 51 ) // Enum value maps for TransferType. @@ -976,6 +982,9 @@ var ( 46: "TRANSFER_TYPE_ORDER_MARGIN_HIGH", 47: "TRANSFER_TYPE_ISOLATED_MARGIN_LOW", 48: "TRANSFER_TYPE_ISOLATED_MARGIN_HIGH", + 49: "TRANSFER_TYPE_AMM_SUBACCOUNT_LOW", + 50: "TRANSFER_TYPE_AMM_SUBACCOUNT_HIGH", + 51: "TRANSFER_TYPE_AMM_SUBACCOUNT_RELEASE", } TransferType_value = map[string]int32{ "TRANSFER_TYPE_UNSPECIFIED": 0, @@ -1021,6 +1030,9 @@ var ( "TRANSFER_TYPE_ORDER_MARGIN_HIGH": 46, "TRANSFER_TYPE_ISOLATED_MARGIN_LOW": 47, "TRANSFER_TYPE_ISOLATED_MARGIN_HIGH": 48, + "TRANSFER_TYPE_AMM_SUBACCOUNT_LOW": 49, + "TRANSFER_TYPE_AMM_SUBACCOUNT_HIGH": 50, + "TRANSFER_TYPE_AMM_SUBACCOUNT_RELEASE": 51, } ) @@ -1191,6 +1203,8 @@ const ( IndividualScope_INDIVIDUAL_SCOPE_IN_TEAM IndividualScope = 2 // All parties that are not part of a team are within the scope of this reward. IndividualScope_INDIVIDUAL_SCOPE_NOT_IN_TEAM IndividualScope = 3 + // All keys representing AMMs are within the scope of this reward. + IndividualScope_INDIVIDUAL_SCOPE_AMM IndividualScope = 4 ) // Enum value maps for IndividualScope. @@ -1200,12 +1214,14 @@ var ( 1: "INDIVIDUAL_SCOPE_ALL", 2: "INDIVIDUAL_SCOPE_IN_TEAM", 3: "INDIVIDUAL_SCOPE_NOT_IN_TEAM", + 4: "INDIVIDUAL_SCOPE_AMM", } IndividualScope_value = map[string]int32{ "INDIVIDUAL_SCOPE_UNSPECIFIED": 0, "INDIVIDUAL_SCOPE_ALL": 1, "INDIVIDUAL_SCOPE_IN_TEAM": 2, "INDIVIDUAL_SCOPE_NOT_IN_TEAM": 3, + "INDIVIDUAL_SCOPE_AMM": 4, } ) @@ -6686,6 +6702,8 @@ type NetworkLimits struct { CanProposeSpotMarket bool `protobuf:"varint,10,opt,name=can_propose_spot_market,json=canProposeSpotMarket,proto3" json:"can_propose_spot_market,omitempty"` // Are perpetual market proposals allowed at this point in time. CanProposePerpetualMarket bool `protobuf:"varint,11,opt,name=can_propose_perpetual_market,json=canProposePerpetualMarket,proto3" json:"can_propose_perpetual_market,omitempty"` + // Can parties use AMM related transactions. + CanUseAmm bool `protobuf:"varint,12,opt,name=can_use_amm,json=canUseAmm,proto3" json:"can_use_amm,omitempty"` } func (x *NetworkLimits) Reset() { @@ -6783,6 +6801,13 @@ func (x *NetworkLimits) GetCanProposePerpetualMarket() bool { return false } +func (x *NetworkLimits) GetCanUseAmm() bool { + if x != nil { + return x.CanUseAmm + } + return false +} + // Represents a liquidity order type LiquidityOrder struct { state protoimpl.MessageState @@ -10664,7 +10689,7 @@ var file_vega_vega_proto_rawDesc = []byte{ 0x22, 0x3a, 0x0a, 0x10, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xfa, 0x03, 0x0a, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9a, 0x04, 0x0a, 0x0d, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x61, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x61, 0x6e, 0x50, @@ -10695,7 +10720,9 @@ var file_vega_vega_proto_rawDesc = []byte{ 0x63, 0x61, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x63, 0x61, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x50, 0x65, - 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4a, 0x04, 0x08, + 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x1e, 0x0a, + 0x0b, 0x63, 0x61, 0x6e, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x61, 0x6d, 0x6d, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x55, 0x73, 0x65, 0x41, 0x6d, 0x6d, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x7d, 0x0a, 0x0e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x33, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, @@ -11425,8 +11452,8 @@ var file_vega_vega_proto_rawDesc = []byte{ 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x10, 0x1d, 0x12, 0x27, 0x0a, 0x23, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x52, 0x45, 0x41, 0x4c, 0x49, 0x53, 0x45, 0x44, 0x5f, - 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x10, 0x1e, 0x22, 0x04, 0x08, 0x08, 0x10, 0x08, 0x2a, 0xd4, - 0x0c, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x10, 0x1e, 0x22, 0x04, 0x08, 0x08, 0x10, 0x08, 0x2a, 0xcb, + 0x0d, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, @@ -11526,88 +11553,97 @@ var file_vega_vega_proto_rawDesc = []byte{ 0x41, 0x54, 0x45, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x2f, 0x12, 0x26, 0x0a, 0x22, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x53, 0x4f, 0x4c, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x47, - 0x49, 0x4e, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x30, 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, 0x22, - 0x04, 0x08, 0x11, 0x10, 0x11, 0x2a, 0x85, 0x03, 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, - 0x63, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x49, 0x53, 0x50, - 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x49, 0x53, - 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x4d, 0x41, 0x4b, - 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x50, 0x41, 0x49, 0x44, 0x10, 0x01, 0x12, 0x27, - 0x0a, 0x23, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, - 0x43, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x52, 0x45, 0x43, - 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x49, 0x53, 0x50, 0x41, - 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x4c, 0x50, 0x5f, 0x46, 0x45, - 0x45, 0x53, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x03, 0x12, 0x20, 0x0a, - 0x1c, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, - 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x04, 0x12, - 0x24, 0x0a, 0x20, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, - 0x49, 0x43, 0x5f, 0x41, 0x56, 0x45, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, - 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, - 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, - 0x45, 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x10, 0x06, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, - 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x52, 0x45, - 0x54, 0x55, 0x52, 0x4e, 0x5f, 0x56, 0x4f, 0x4c, 0x41, 0x54, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x10, - 0x07, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, - 0x54, 0x52, 0x49, 0x43, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x52, - 0x41, 0x4e, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x49, 0x53, 0x50, - 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x52, 0x45, 0x41, 0x4c, - 0x49, 0x53, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x10, 0x09, 0x2a, 0x61, 0x0a, - 0x0b, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, - 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x4e, - 0x54, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x44, 0x49, 0x56, - 0x49, 0x44, 0x55, 0x41, 0x4c, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x4e, 0x54, 0x49, - 0x54, 0x59, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x53, 0x10, 0x02, - 0x2a, 0x8d, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x53, - 0x63, 0x6f, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, - 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, - 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x01, - 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, - 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, 0x02, 0x12, 0x20, - 0x0a, 0x1c, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, - 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, 0x03, - 0x2a, 0x81, 0x01, 0x0a, 0x14, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, - 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, - 0x47, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x22, 0x0a, 0x1e, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x5f, 0x52, 0x41, - 0x54, 0x41, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x52, 0x41, - 0x4e, 0x4b, 0x10, 0x02, 0x2a, 0x63, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, - 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x19, 0x0a, 0x15, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x4e, 0x4f, - 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x59, 0x0a, 0x0b, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x50, 0x4f, 0x43, - 0x48, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x50, 0x4f, 0x43, 0x48, 0x5f, - 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x01, 0x12, 0x14, - 0x0a, 0x10, 0x45, 0x50, 0x4f, 0x43, 0x48, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, - 0x4e, 0x44, 0x10, 0x02, 0x2a, 0xa7, 0x01, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x21, + 0x49, 0x4e, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x30, 0x12, 0x24, 0x0a, 0x20, 0x54, 0x52, 0x41, + 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4d, 0x4d, 0x5f, 0x53, + 0x55, 0x42, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x31, 0x12, + 0x25, 0x0a, 0x21, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x41, 0x4d, 0x4d, 0x5f, 0x53, 0x55, 0x42, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, + 0x48, 0x49, 0x47, 0x48, 0x10, 0x32, 0x12, 0x28, 0x0a, 0x24, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4d, 0x4d, 0x5f, 0x53, 0x55, 0x42, 0x41, + 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x10, 0x33, + 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, 0x22, 0x04, 0x08, 0x11, 0x10, 0x11, 0x2a, 0x85, 0x03, 0x0a, + 0x0e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, + 0x1f, 0x0a, 0x1b, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, + 0x49, 0x43, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, + 0x52, 0x49, 0x43, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x50, + 0x41, 0x49, 0x44, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, + 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x46, + 0x45, 0x45, 0x53, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x10, 0x02, 0x12, 0x24, + 0x0a, 0x20, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, + 0x43, 0x5f, 0x4c, 0x50, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, + 0x45, 0x44, 0x10, 0x03, 0x12, 0x20, 0x0a, 0x1c, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, + 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x56, + 0x41, 0x4c, 0x55, 0x45, 0x10, 0x04, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, + 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x41, 0x56, 0x45, 0x52, 0x41, 0x47, + 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x23, 0x0a, 0x1f, + 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, + 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x10, + 0x06, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, + 0x54, 0x52, 0x49, 0x43, 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x5f, 0x56, 0x4f, 0x4c, 0x41, + 0x54, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x10, 0x07, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, 0x50, + 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x56, 0x41, 0x4c, 0x49, + 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x12, + 0x23, 0x0a, 0x1f, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x52, + 0x49, 0x43, 0x5f, 0x52, 0x45, 0x41, 0x4c, 0x49, 0x53, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x54, 0x55, + 0x52, 0x4e, 0x10, 0x09, 0x2a, 0x61, 0x0a, 0x0b, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x63, + 0x6f, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x43, + 0x4f, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x43, 0x4f, 0x50, + 0x45, 0x5f, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, 0x53, 0x10, 0x01, 0x12, + 0x16, 0x0a, 0x12, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, + 0x54, 0x45, 0x41, 0x4d, 0x53, 0x10, 0x02, 0x2a, 0xa7, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x64, 0x69, + 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x1c, 0x49, + 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, + 0x14, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, 0x50, + 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x44, 0x49, 0x56, + 0x49, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x54, + 0x45, 0x41, 0x4d, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, 0x44, 0x49, 0x56, 0x49, 0x44, + 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, + 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x44, 0x49, 0x56, + 0x49, 0x44, 0x55, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x41, 0x4d, 0x4d, 0x10, + 0x04, 0x2a, 0x81, 0x01, 0x0a, 0x14, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, + 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, + 0x45, 0x47, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x5f, 0x52, + 0x41, 0x54, 0x41, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, + 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x52, + 0x41, 0x4e, 0x4b, 0x10, 0x02, 0x2a, 0x63, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x19, 0x0a, 0x15, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x4e, + 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x59, 0x0a, 0x0b, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x50, 0x4f, + 0x43, 0x48, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x50, 0x4f, 0x43, 0x48, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x01, 0x12, + 0x14, 0x0a, 0x10, 0x45, 0x50, 0x4f, 0x43, 0x48, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x45, 0x4e, 0x44, 0x10, 0x02, 0x2a, 0xa7, 0x01, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, + 0x21, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, + 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x45, + 0x4e, 0x44, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x56, 0x41, + 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x45, 0x52, 0x53, 0x41, 0x54, 0x5a, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, - 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x45, 0x4e, - 0x44, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x45, 0x52, 0x53, 0x41, 0x54, 0x5a, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x2a, 0x68, - 0x0a, 0x0a, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, - 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x41, 0x52, - 0x47, 0x49, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, 0x4d, - 0x41, 0x52, 0x47, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x4d, 0x41, 0x52, 0x47, 0x49, - 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x49, 0x53, 0x4f, 0x4c, 0x41, 0x54, 0x45, 0x44, 0x5f, - 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x10, 0x02, 0x42, 0x27, 0x5a, 0x25, 0x63, 0x6f, 0x64, 0x65, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, - 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, - 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x2a, + 0x68, 0x0a, 0x0a, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, + 0x17, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x41, + 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x5f, + 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x4d, 0x41, 0x52, 0x47, + 0x49, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x49, 0x53, 0x4f, 0x4c, 0x41, 0x54, 0x45, 0x44, + 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x10, 0x02, 0x42, 0x27, 0x5a, 0x25, 0x63, 0x6f, 0x64, + 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, + 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, + 0x67, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/protos/vega/wallet/v1/wallet.pb.go b/protos/vega/wallet/v1/wallet.pb.go index 155cc7e127c..ae2d497fd10 100644 --- a/protos/vega/wallet/v1/wallet.pb.go +++ b/protos/vega/wallet/v1/wallet.pb.go @@ -54,6 +54,9 @@ type SubmitTransactionRequest struct { // *SubmitTransactionRequest_JoinTeam // *SubmitTransactionRequest_BatchProposalSubmission // *SubmitTransactionRequest_UpdatePartyProfile + // *SubmitTransactionRequest_SubmitAmm + // *SubmitTransactionRequest_AmendAmm + // *SubmitTransactionRequest_CancelAmm // *SubmitTransactionRequest_NodeVote // *SubmitTransactionRequest_NodeSignature // *SubmitTransactionRequest_ChainEvent @@ -288,6 +291,27 @@ func (x *SubmitTransactionRequest) GetUpdatePartyProfile() *v1.UpdatePartyProfil return nil } +func (x *SubmitTransactionRequest) GetSubmitAmm() *v1.SubmitAMM { + if x, ok := x.GetCommand().(*SubmitTransactionRequest_SubmitAmm); ok { + return x.SubmitAmm + } + return nil +} + +func (x *SubmitTransactionRequest) GetAmendAmm() *v1.AmendAMM { + if x, ok := x.GetCommand().(*SubmitTransactionRequest_AmendAmm); ok { + return x.AmendAmm + } + return nil +} + +func (x *SubmitTransactionRequest) GetCancelAmm() *v1.CancelAMM { + if x, ok := x.GetCommand().(*SubmitTransactionRequest_CancelAmm); ok { + return x.CancelAmm + } + return nil +} + func (x *SubmitTransactionRequest) GetNodeVote() *v1.NodeVote { if x, ok := x.GetCommand().(*SubmitTransactionRequest_NodeVote); ok { return x.NodeVote @@ -459,6 +483,18 @@ type SubmitTransactionRequest_UpdatePartyProfile struct { UpdatePartyProfile *v1.UpdatePartyProfile `protobuf:"bytes,1024,opt,name=update_party_profile,json=updatePartyProfile,proto3,oneof"` } +type SubmitTransactionRequest_SubmitAmm struct { + SubmitAmm *v1.SubmitAMM `protobuf:"bytes,1025,opt,name=submit_amm,json=submitAmm,proto3,oneof"` +} + +type SubmitTransactionRequest_AmendAmm struct { + AmendAmm *v1.AmendAMM `protobuf:"bytes,1026,opt,name=amend_amm,json=amendAmm,proto3,oneof"` +} + +type SubmitTransactionRequest_CancelAmm struct { + CancelAmm *v1.CancelAMM `protobuf:"bytes,1027,opt,name=cancel_amm,json=cancelAmm,proto3,oneof"` +} + type SubmitTransactionRequest_NodeVote struct { // Validator commands NodeVote *v1.NodeVote `protobuf:"bytes,2002,opt,name=node_vote,json=nodeVote,proto3,oneof"` @@ -550,6 +586,12 @@ func (*SubmitTransactionRequest_BatchProposalSubmission) isSubmitTransactionRequ func (*SubmitTransactionRequest_UpdatePartyProfile) isSubmitTransactionRequest_Command() {} +func (*SubmitTransactionRequest_SubmitAmm) isSubmitTransactionRequest_Command() {} + +func (*SubmitTransactionRequest_AmendAmm) isSubmitTransactionRequest_Command() {} + +func (*SubmitTransactionRequest_CancelAmm) isSubmitTransactionRequest_Command() {} + func (*SubmitTransactionRequest_NodeVote) isSubmitTransactionRequest_Command() {} func (*SubmitTransactionRequest_NodeSignature) isSubmitTransactionRequest_Command() {} @@ -582,7 +624,7 @@ var file_vega_wallet_v1_wallet_proto_rawDesc = []byte{ 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdd, 0x18, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x6d, 0x69, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x97, 0x1a, 0x0a, 0x18, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, @@ -723,68 +765,79 @@ var file_vega_wallet_v1_wallet_proto_rawDesc = []byte{ 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x18, 0xd2, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x6f, 0x74, 0x65, 0x48, 0x00, 0x52, 0x08, 0x6e, - 0x6f, 0x64, 0x65, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x49, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0xd3, 0x0f, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x48, 0x00, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x18, 0xd4, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, - 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5c, 0x0a, 0x15, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, - 0x74, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xd5, 0x0f, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, - 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x13, 0x6b, + 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x73, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x5f, 0x61, 0x6d, 0x6d, 0x18, 0x81, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x41, 0x4d, 0x4d, 0x48, 0x00, 0x52, + 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x41, 0x6d, 0x6d, 0x12, 0x3a, 0x0a, 0x09, 0x61, 0x6d, + 0x65, 0x6e, 0x64, 0x5f, 0x61, 0x6d, 0x6d, 0x18, 0x82, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x6d, 0x65, 0x6e, 0x64, 0x41, 0x4d, 0x4d, 0x48, 0x00, 0x52, 0x08, 0x61, 0x6d, + 0x65, 0x6e, 0x64, 0x41, 0x6d, 0x6d, 0x12, 0x3d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, + 0x5f, 0x61, 0x6d, 0x6d, 0x18, 0x83, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x41, 0x4d, 0x4d, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x41, 0x6d, 0x6d, 0x12, 0x3a, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x76, 0x6f, + 0x74, 0x65, 0x18, 0xd2, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x56, 0x6f, 0x74, 0x65, 0x48, 0x00, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x56, 0x6f, 0x74, + 0x65, 0x12, 0x49, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x18, 0xd3, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x6e, + 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x40, 0x0a, 0x0b, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0xd4, 0x0f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5c, + 0x0a, 0x15, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x75, 0x62, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xd5, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x13, 0x6b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, + 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x62, 0x0a, 0x17, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0xd6, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x15, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x12, 0x58, 0x0a, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x68, 0x65, + 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0xd7, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x72, 0x74, + 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x75, 0x0a, 0x1e, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, + 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xd8, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x62, 0x0a, 0x17, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x69, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0xd6, 0x0f, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x48, 0x00, 0x52, - 0x15, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x58, 0x0a, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0xd7, 0x0f, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x12, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, - 0x12, 0x75, 0x0a, 0x1e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x6b, 0x65, 0x79, - 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0xd8, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, - 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x1b, 0x65, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x68, 0x0a, 0x19, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x18, 0xd9, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, - 0x6c, 0x12, 0x4f, 0x0a, 0x10, 0x69, 0x73, 0x73, 0x75, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0xda, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x49, 0x73, 0x73, 0x75, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x48, - 0x00, 0x52, 0x0f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x16, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xb9, 0x17, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x14, 0x6f, - 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4a, 0x06, - 0x08, 0xd1, 0x0f, 0x10, 0xd2, 0x0f, 0x42, 0x31, 0x5a, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, - 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, - 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x1b, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, + 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x68, 0x0a, 0x19, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x75, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0xd9, + 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x48, 0x00, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x4f, 0x0a, 0x10, 0x69, + 0x73, 0x73, 0x75, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, + 0xda, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x53, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x69, 0x73, 0x73, + 0x75, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x16, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x75, 0x62, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xb9, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x53, 0x75, 0x62, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x14, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x09, 0x0a, + 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4a, 0x06, 0x08, 0xd1, 0x0f, 0x10, 0xd2, 0x0f, + 0x42, 0x31, 0x5a, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, + 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -826,16 +879,19 @@ var file_vega_wallet_v1_wallet_proto_goTypes = []interface{}{ (*v1.JoinTeam)(nil), // 22: vega.commands.v1.JoinTeam (*v1.BatchProposalSubmission)(nil), // 23: vega.commands.v1.BatchProposalSubmission (*v1.UpdatePartyProfile)(nil), // 24: vega.commands.v1.UpdatePartyProfile - (*v1.NodeVote)(nil), // 25: vega.commands.v1.NodeVote - (*v1.NodeSignature)(nil), // 26: vega.commands.v1.NodeSignature - (*v1.ChainEvent)(nil), // 27: vega.commands.v1.ChainEvent - (*v1.KeyRotateSubmission)(nil), // 28: vega.commands.v1.KeyRotateSubmission - (*v1.StateVariableProposal)(nil), // 29: vega.commands.v1.StateVariableProposal - (*v1.ValidatorHeartbeat)(nil), // 30: vega.commands.v1.ValidatorHeartbeat - (*v1.EthereumKeyRotateSubmission)(nil), // 31: vega.commands.v1.EthereumKeyRotateSubmission - (*v1.ProtocolUpgradeProposal)(nil), // 32: vega.commands.v1.ProtocolUpgradeProposal - (*v1.IssueSignatures)(nil), // 33: vega.commands.v1.IssueSignatures - (*v1.OracleDataSubmission)(nil), // 34: vega.commands.v1.OracleDataSubmission + (*v1.SubmitAMM)(nil), // 25: vega.commands.v1.SubmitAMM + (*v1.AmendAMM)(nil), // 26: vega.commands.v1.AmendAMM + (*v1.CancelAMM)(nil), // 27: vega.commands.v1.CancelAMM + (*v1.NodeVote)(nil), // 28: vega.commands.v1.NodeVote + (*v1.NodeSignature)(nil), // 29: vega.commands.v1.NodeSignature + (*v1.ChainEvent)(nil), // 30: vega.commands.v1.ChainEvent + (*v1.KeyRotateSubmission)(nil), // 31: vega.commands.v1.KeyRotateSubmission + (*v1.StateVariableProposal)(nil), // 32: vega.commands.v1.StateVariableProposal + (*v1.ValidatorHeartbeat)(nil), // 33: vega.commands.v1.ValidatorHeartbeat + (*v1.EthereumKeyRotateSubmission)(nil), // 34: vega.commands.v1.EthereumKeyRotateSubmission + (*v1.ProtocolUpgradeProposal)(nil), // 35: vega.commands.v1.ProtocolUpgradeProposal + (*v1.IssueSignatures)(nil), // 36: vega.commands.v1.IssueSignatures + (*v1.OracleDataSubmission)(nil), // 37: vega.commands.v1.OracleDataSubmission } var file_vega_wallet_v1_wallet_proto_depIdxs = []int32{ 1, // 0: vega.wallet.v1.SubmitTransactionRequest.order_submission:type_name -> vega.commands.v1.OrderSubmission @@ -862,21 +918,24 @@ var file_vega_wallet_v1_wallet_proto_depIdxs = []int32{ 22, // 21: vega.wallet.v1.SubmitTransactionRequest.join_team:type_name -> vega.commands.v1.JoinTeam 23, // 22: vega.wallet.v1.SubmitTransactionRequest.batch_proposal_submission:type_name -> vega.commands.v1.BatchProposalSubmission 24, // 23: vega.wallet.v1.SubmitTransactionRequest.update_party_profile:type_name -> vega.commands.v1.UpdatePartyProfile - 25, // 24: vega.wallet.v1.SubmitTransactionRequest.node_vote:type_name -> vega.commands.v1.NodeVote - 26, // 25: vega.wallet.v1.SubmitTransactionRequest.node_signature:type_name -> vega.commands.v1.NodeSignature - 27, // 26: vega.wallet.v1.SubmitTransactionRequest.chain_event:type_name -> vega.commands.v1.ChainEvent - 28, // 27: vega.wallet.v1.SubmitTransactionRequest.key_rotate_submission:type_name -> vega.commands.v1.KeyRotateSubmission - 29, // 28: vega.wallet.v1.SubmitTransactionRequest.state_variable_proposal:type_name -> vega.commands.v1.StateVariableProposal - 30, // 29: vega.wallet.v1.SubmitTransactionRequest.validator_heartbeat:type_name -> vega.commands.v1.ValidatorHeartbeat - 31, // 30: vega.wallet.v1.SubmitTransactionRequest.ethereum_key_rotate_submission:type_name -> vega.commands.v1.EthereumKeyRotateSubmission - 32, // 31: vega.wallet.v1.SubmitTransactionRequest.protocol_upgrade_proposal:type_name -> vega.commands.v1.ProtocolUpgradeProposal - 33, // 32: vega.wallet.v1.SubmitTransactionRequest.issue_signatures:type_name -> vega.commands.v1.IssueSignatures - 34, // 33: vega.wallet.v1.SubmitTransactionRequest.oracle_data_submission:type_name -> vega.commands.v1.OracleDataSubmission - 34, // [34:34] is the sub-list for method output_type - 34, // [34:34] is the sub-list for method input_type - 34, // [34:34] is the sub-list for extension type_name - 34, // [34:34] is the sub-list for extension extendee - 0, // [0:34] is the sub-list for field type_name + 25, // 24: vega.wallet.v1.SubmitTransactionRequest.submit_amm:type_name -> vega.commands.v1.SubmitAMM + 26, // 25: vega.wallet.v1.SubmitTransactionRequest.amend_amm:type_name -> vega.commands.v1.AmendAMM + 27, // 26: vega.wallet.v1.SubmitTransactionRequest.cancel_amm:type_name -> vega.commands.v1.CancelAMM + 28, // 27: vega.wallet.v1.SubmitTransactionRequest.node_vote:type_name -> vega.commands.v1.NodeVote + 29, // 28: vega.wallet.v1.SubmitTransactionRequest.node_signature:type_name -> vega.commands.v1.NodeSignature + 30, // 29: vega.wallet.v1.SubmitTransactionRequest.chain_event:type_name -> vega.commands.v1.ChainEvent + 31, // 30: vega.wallet.v1.SubmitTransactionRequest.key_rotate_submission:type_name -> vega.commands.v1.KeyRotateSubmission + 32, // 31: vega.wallet.v1.SubmitTransactionRequest.state_variable_proposal:type_name -> vega.commands.v1.StateVariableProposal + 33, // 32: vega.wallet.v1.SubmitTransactionRequest.validator_heartbeat:type_name -> vega.commands.v1.ValidatorHeartbeat + 34, // 33: vega.wallet.v1.SubmitTransactionRequest.ethereum_key_rotate_submission:type_name -> vega.commands.v1.EthereumKeyRotateSubmission + 35, // 34: vega.wallet.v1.SubmitTransactionRequest.protocol_upgrade_proposal:type_name -> vega.commands.v1.ProtocolUpgradeProposal + 36, // 35: vega.wallet.v1.SubmitTransactionRequest.issue_signatures:type_name -> vega.commands.v1.IssueSignatures + 37, // 36: vega.wallet.v1.SubmitTransactionRequest.oracle_data_submission:type_name -> vega.commands.v1.OracleDataSubmission + 37, // [37:37] is the sub-list for method output_type + 37, // [37:37] is the sub-list for method input_type + 37, // [37:37] is the sub-list for extension type_name + 37, // [37:37] is the sub-list for extension extendee + 0, // [0:37] is the sub-list for field type_name } func init() { file_vega_wallet_v1_wallet_proto_init() } @@ -923,6 +982,9 @@ func file_vega_wallet_v1_wallet_proto_init() { (*SubmitTransactionRequest_JoinTeam)(nil), (*SubmitTransactionRequest_BatchProposalSubmission)(nil), (*SubmitTransactionRequest_UpdatePartyProfile)(nil), + (*SubmitTransactionRequest_SubmitAmm)(nil), + (*SubmitTransactionRequest_AmendAmm)(nil), + (*SubmitTransactionRequest_CancelAmm)(nil), (*SubmitTransactionRequest_NodeVote)(nil), (*SubmitTransactionRequest_NodeSignature)(nil), (*SubmitTransactionRequest_ChainEvent)(nil), diff --git a/wallet/commands/commands.go b/wallet/commands/commands.go index 40419b01a0c..d335d3738c1 100644 --- a/wallet/commands/commands.go +++ b/wallet/commands/commands.go @@ -101,6 +101,12 @@ func CheckSubmitTransactionRequest(req *walletpb.SubmitTransactionRequest) comma cmdErr = commands.CheckJoinTeam(cmd.JoinTeam) case *walletpb.SubmitTransactionRequest_UpdatePartyProfile: cmdErr = commands.CheckUpdatePartyProfile(cmd.UpdatePartyProfile) + case *walletpb.SubmitTransactionRequest_SubmitAmm: + cmdErr = commands.CheckSubmitAMM(cmd.SubmitAmm) + case *walletpb.SubmitTransactionRequest_AmendAmm: + cmdErr = commands.CheckAmendAMM(cmd.AmendAmm) + case *walletpb.SubmitTransactionRequest_CancelAmm: + cmdErr = commands.CheckCancelAMM(cmd.CancelAmm) default: errs.AddForProperty("input_data.command", commands.ErrIsNotSupported) } @@ -252,6 +258,18 @@ func WrapRequestCommandIntoInputData(data *commandspb.InputData, req *walletpb.S data.Command = &commandspb.InputData_UpdatePartyProfile{ UpdatePartyProfile: req.GetUpdatePartyProfile(), } + case *walletpb.SubmitTransactionRequest_SubmitAmm: + data.Command = &commandspb.InputData_SubmitAmm{ + SubmitAmm: req.GetSubmitAmm(), + } + case *walletpb.SubmitTransactionRequest_AmendAmm: + data.Command = &commandspb.InputData_AmendAmm{ + AmendAmm: req.GetAmendAmm(), + } + case *walletpb.SubmitTransactionRequest_CancelAmm: + data.Command = &commandspb.InputData_CancelAmm{ + CancelAmm: req.GetCancelAmm(), + } default: panic(fmt.Sprintf("command %T is not supported", cmd)) }